2017-04-04 59 views
2

我有2个表:Oracle sql。比较两个表中查找丢失的数据

运营商(ID,姓名,PRODUCT_ID)
产品(ID)

算表包含此数据:

| 1 | Op1 | Pr1 | 
| 2 | Op2 | Pr2 | 

产品表:

| Pr1 | 
| Pr2 | 
| Pr3 | 

而我需要的是展示Op1不具备的产品e和 的产品,Op2中没有:

| Op1 | Pr2 | 
| Op1 | Pr3 | 
| Op2 | Pr1 | 
| Op2 | Pr3 | 

能否请您指教解决这一任务的有效方式。 我有1个解决方案与建设交叉连接,但我认为应该有一个正确和简单的方法。

+0

可能重复的[SQL - 从一个表中查找记录不存在于另一个](http://stackoverflow.com/questions/367863/sql-find-records-from-one-table-不存在于另一个中) –

回答

1

我会用minus

demo

select o.name op_name, p.name pr_name from operator o cross join product p 
minus 
select name, product_id from operator 
+0

感谢您的优雅和简单的解决方案。并为演示链接。 – ayscha

1

我不明白你的数据模型。您似乎有一个名为operator.name的列,该列应与product.id匹配。让我假设数据格式实际上是合理的。你真的应该有三个表:

  • Operators - 每 “operator_id”
  • Products一行 - 每 “PRODUCT_ID”
  • OperatorProducts一行 - 两
  • 之间的结表

您可以分两步进行。首先创建操作员和产品的所有组合(cross join)。然后剔除掉所存在的那些(left join):

select o.operator_id, p.product_id 
from (select distinct id as operator_id from operator) o cross join 
    product p left join 
    operator op 
    on op.id = o.operator_id and op.product_id = p.product_id 
where p.product_id is null; 

如果您需要的名称,您可以加入他们的行列

+0

关于表格结构,我希望在问题中尽可能使用简单模型,但是我在产品表格中输入了一个错字,它包含一个id。让我们假设id是产品名称。 并关于你的答案。感谢您的建议,我想过使用交叉连接类似的东西,但只是不确定它是最好的解决方案.. – ayscha

0

交叉连接是什么这里需要。

select o.name, p.id from product p 
cross join operator o 
where 
    o.product_id != p.id