嗨我想从两个表中得到相反的。
我有一张促销台和购买桌。我想要做的是获取销售表中未包含的所有购买ID。
促销表
sale_id(pk)
product_id(fk)
purchase_id(fk)
购买表
product_id(fk)
purchase_id(pk)
SELECT DISTINCT purchase_id
, product_id
FROM
purchase
INNER JOIN sale
USING (purchase_id, product_id);
这是一个例子: 如果我运行上面的代码,那将是结果。
purchase_id product id
1 1
1 2
1 4
2 1
2 3
现在我想得到:
purchase_id product id
1 3
2 2
简而言之,我希望获得上述代码的反转。提前谢谢。
答案 0 :(得分:1)
好的,我想我现在明白了。
这应该返回任何在销售中没有匹配条目的购买条目。
SELECT
`purchase`.`purchase_id`, `purchase`.`product_id`
FROM `purchase`
LEFT JOIN `sale` ON `sale`.`purchase_id` = `purchase`.`purchase_id` AND `sale`.`product_id` = `purchase`.`product_id`
WHERE
`sale`.`sale_id` IS NULL
ORDER BY
`purchase`.`purchase_id`, `purchase`.`product_id`
答案 1 :(得分:0)
如果您希望获得销售表中没有相关值的所有购买,您可以使用LEFT JOIN
:
select
p.purchase_id
from
purchase as p
left join sale as s on p.purchase_id = s.purchase_id
where
s.purchase_id is null;
"单侧"当您想要从表中获取数据时,即使另一个相关表中的数据不存在,联接(LEFT JOIN
,RIGHT JOIN
)也很有用。当然,这意味着当第二个表中没有相关数据时,您可以从一个表中过滤数据。
希望这有帮助。
查看您更新的问题和评论,我认为您需要所有未使用的组合。
您需要分两步拆分:
purchase_id
和sale_id
值的所有可能组合("笛卡尔积和"两组)。这可以使用子查询来完成。
第1步。
select distinct p.purchase_id, s.product_id from purchase as p, sale as s;
第2步。(您的查询)
select distinct
purchase_id, product_id
from
purchase as p
inner join sale as s
on (p.purchase_id = s.purchase_id and p.product_id = s.product_id);
第3步。将所有内容放在一起
select
a.*
from
(select distinct p.purchase_id, s.product_id from purchase as p, sale as s) as a
left join (
select distinct
purchase_id, product_id
from
purchase as p
inner join sale as s
on (p.purchase_id = s.purchase_id and p.product_id = s.product_id)
) as e on (a.purchase_id = e.purchase_id and a.product_id = e.product_id)
where
e.purchase_id is null and e.product_id is null;