Oracle sql。比较两个表以查找缺失的数据

时间:2017-04-04 11:10:14

标签: sql oracle

我有两张桌子:

运营商(id,name,product_id)
产品(id)

运算符表包含以下数据:

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

产品表:

|    Pr1   |  
|    Pr2   |  
|    Pr3   |

我需要的是展示Op1没有的产品,以及 Op2没有的产品:

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

请您指出解决此任务的有效方法。 我有一个建立交叉连接的解决方案,但我认为应该有一个正确而简单的方法。

3 个答案:

答案 0 :(得分: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;

如果您需要这些名字,可以加入。

答案 1 :(得分: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

答案 2 :(得分:0)

这里需要交叉连接。

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