好的,所以我的问题是我有一组结果:
识别码 1个 1乙 3℃
我还有另一张桌子:
代码 一个 乙 C
我想使用 SQL 获得的是表 1 中的每个结果都缺失的 CODES 查询。所以基本上:
识别码 1℃ 3个 3乙
任何帮助都会很棒。
您可以使用:
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
您可以使用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
是可选的。它会使构建可能列表的速度变慢,但更快地确定您是否已经拥有其中之一。我会测试它,看看哪个更快。