这可以通过多种方式实现。但是使用NOT EXISTS
是最好的选择。您的查询的问题是acc_num
1,有些ser_code
没有 10、15 的值。所以你会得到A
结果B
。
要克服这一点,您必须拉acc_num
入sub-query
查询 1(使用 NOT EXISTS):
正如您在下面的查询中看到的,我已包含acc_num
inside sub-query
,以便过滤器正常工作,
SELECT DISTINCT a.acc_num, a.ser_code
FROM one as a
WHERE NOT EXISTS
(
SELECT DISTINCT one.acc_num
FROM two
INNER JOIN one
ON one.ser_code=two.ser_code
WHERE value IN (10,15) AND a.acc_num=one.acc_num
)
查询 2(使用 LEFT JOIN):
由于它的性质,不存在经常令人困惑(fast
虽然超级)。因此LEFT JOIN
也可以使用(比 贵NOT EXISTS
),
SELECT DISTINCT a.acc_num, a.ser_code
FROM one as a
LEFT JOIN
(
SELECT DISTINCT one.acc_num
FROM two
INNER JOIN one
ON one.ser_code=two.ser_code
WHERE value IN (10,15)
) b
ON a.acc_num=b.acc_num
WHERE b.acc_num IS NULL
查询 3(使用 NOT IN):
NOT IN
也可以通过综合查询来实现这一点,但比上述两种方法都昂贵,
SELECT DISTINCT a.acc_num, a.ser_code
FROM one as a
WHERE a.acc_num NOT IN
(
SELECT DISTINCT one.acc_num
FROM two
INNER JOIN one
ON one.ser_code=two.ser_code
WHERE value IN (10,15)
)
所有 3 将产生相同的结果。我宁愿选择NOT EXISTS
请参阅db<>fiddle中的时间消耗演示