3

嗨,我想从两张桌子上得到相反的相交。

我有一个销售表和购买表。我想要做的是获取所有未包含在销售表中的购买 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

简而言之,我想得到上述代码的逆。提前致谢。

4

2 回答 2

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`
于 2013-08-24T03:53:33.663 回答
0

如果要获取 sales 表中没有相关值的所有购买,可以使用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当然,这意味着当第二个表中没有相关数据时,您可以从一个表中过滤数据。

希望这可以帮助。


查看您更新的问题和评论,我认为您希望不使用所有可能的组合。

您需要将其拆分为两个步骤:

  1. 首先,您需要purchase_idsale_id值的所有可能组合(这两个集合的“笛卡尔积”)。
  2. 然后你需要得到所有已经使用的组合。
  3. 最后,您需要排除所有已使用的组合。

这可以使用子查询来完成。

步骤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;
于 2013-08-23T22:20:27.497 回答