MYSQL得到两个结果的差异

时间:2012-08-05 16:28:12

标签: mysql intersect

好吧所以我的问题是我有一组结果:

ID  CODE
1   A
1   B
3   C

我还有另一张表:

CODE
A
B
C

我想要使用SQL获得的是CODES查询,缺少表1中的每个结果。所以基本上:

ID  CODE
1   C
3   A
3   B

任何帮助都会很棒。

2 个答案:

答案 0 :(得分:1)

您可以使用:

SELECT     a.id, b.code
FROM       (SELECT DISTINCT id FROM idcodes) a
CROSS JOIN codes b
LEFT JOIN  idcodes c ON a.id = c.id AND b.code = c.code
WHERE      c.id IS NULL
ORDER BY   a.id, b.code

如果你有另一个表存储id的唯一条目,那么最好只使用该表而不是DISTINCT子选择:

SELECT     a.id, b.code
FROM       ids a
CROSS JOIN codes b
LEFT JOIN  idcodes c ON a.id = c.id AND b.code = c.code
WHERE      c.id IS NULL
ORDER BY   a.id, b.code

SQLFiddle Demo

答案 1 :(得分:0)

您可以使用exists。使用笛卡尔联接构建可能的变体的完整列表,然后确保您拥有的不在此列表中。

select id, code
  from idcode_table x
 where not exists ( select 1 
                      from idcode_table a
                     cross join code_table b
                     where b.code = x.code
                       and a.id = x.id )

也可以使用not in重新编写。

select id, code
  from idcode_table
 where (id, code) not in ( select distinct a.id, b.code
                             from idcode_table a
                            cross join code_table b )

distinct是可选的。它会使构建可能列表变慢,但更快确定是否已经有其中一个。我测试它看哪个更快。