我有两张桌子:
运营商(id,name,product_id)
产品(id)
运算符表包含以下数据:
| 1 | Op1 | Pr1 |
| 2 | Op2 | Pr2 |
产品表:
| Pr1 |
| Pr2 |
| Pr3 |
我需要的是展示Op1没有的产品,以及 Op2没有的产品:
| Op1 | Pr2 |
| Op1 | Pr3 |
| Op2 | Pr1 |
| Op2 | Pr3 |
请您指出解决此任务的有效方法。 我有一个建立交叉连接的解决方案,但我认为应该有一个正确而简单的方法。
答案 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