具有多个外键的内连接(Intersect)的反转

时间:2013-08-23 22:14:34

标签: mysql sql foreign-keys foreign-key-relationship

嗨我想从两个表中得到相反的

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

简而言之,我希望获得上述代码的反转。提前谢谢。

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 JOINRIGHT JOIN)也很有用。当然,这意味着当第二个表中没有相关数据时,您可以从一个表中过滤数据。

希望这有帮助。


查看您更新的问题和评论,我认为您需要所有未使用的组合。

您需要分两步拆分:

  1. 首先,您需要purchase_idsale_id值的所有可能组合("笛卡尔积和"两组)。
  2. 然后你需要获得已经使用过的所有组合。
  3. 最后,您需要排除已使用的所有组合。
  4. 这可以使用子查询来完成。

    第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;
    
相关问题