【问题标题】:Oracle sql. Compare two tables to find missing data甲骨文 sql。比较两个表以查找缺失数据
【发布时间】:2017-04-04 11:10:13
【问题描述】:

我有两张桌子:

操作员(id、名称、product_id)
产品 (id)

运算符表包含以下数据:

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

产品表:

|    Pr1   |  
|    Pr2   |  
|    Pr3   |

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

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

您能否建议一种解决此任务的有效方法。 我有 1 个构建交叉连接的解决方案,但我认为应该有一个正确且更简单的方法。

【问题讨论】:

标签: sql oracle


【解决方案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】:

我不了解您的数据模型。您似乎有一个名为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;

如果你需要名字,你可以加入。

【讨论】:

  • 关于表结构,我希望问题中的模型尽可能简单,但我在产品表中打错了字,它包含一个 id。假设 id 是产品名称。关于你的回答。感谢您的建议,我想到了使用交叉连接的类似方法,但不确定它是否是最好的解决方案..
【解决方案3】:

这里需要交叉连接。

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

【讨论】:

    猜你喜欢
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 2021-12-23
    • 2014-08-08
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多