我正在尝试为MySQL编写一个SELECT语句,它从表A中选择表B中不存在的内容。大多数示例只使用一个字段作为键。在我的情况下,我有3个字段。
TableA => a.fieldA, a.fieldB, a.fieldC
1,1,1
1,2,1
1,3,1
1,4,1
1,5,1
TableB => b.fieldA, b.fieldB, b.fieldC
1,1,1
1,3,1
1,4,1
所以我只想要TableA中不存在于TableB中的字段
Result
1,2,1
1,5,1
我尝试了LEFT JOIN,但没有运气
SELECT a.fieldA, a.fieldB, a.fieldC
FROM TableA a
LEFT JOIN TableB b ON (
a.fieldA = b.fieldA
AND a.fieldB = b.fieldB
AND a.fieldC = b.fieldC)
WHERE a.fieldA = 1
AND a.fieldC = 1
我也试过NOT IN,但不知道如何用3个字段做到这一点。
我知道这一定很简单,但我是盲目的。糟糕的一天:(
答案 0 :(得分:6)
使用NOT IN:
SELECT a.fieldA, a.fieldB, a.fieldC
FROM tableA a
WHERE (a.fieldA, a.fieldB, a.fieldC) NOT IN (
SELECT b.fieldA, b.fieldB, b.fieldC
FROM tableB b)
使用LEFT JOIN:
SELECT a.fieldA, a.fieldB, a.fieldC
FROM tableA a
LEFT JOIN tableB b ON (
a.fieldA = b.fieldA
AND a.fieldB = b.fieldB
AND a.fieldC = b.fieldC)
WHERE b.fieldA IS NULL
修改强>
我只是在类似的排名another way using NOT EXISTS
中找到SELECT a.fieldA, a.fieldB, a.fieldC
FROM tableA a
WHERE NOT EXISTS (
SELECT 1
FROM tableB b
WHERE a.fieldA = b.fieldA
AND a.fieldB = b.fieldB
AND a.fieldC = b.fieldC
);
答案 1 :(得分:0)
您可以尝试连接字段,然后一次比较所有字段
SELECT a.fieldA, a.fieldB, a.fieldC
FROM TableA a
LEFT JOIN TableB b ON (
CONCAT(a.fieldA,a.fieldB,a.fieldC) <> CONCAT(b.fieldA,b.fieldB,b.fieldC)
)
答案 2 :(得分:0)
尝试使用此查询:
select * from TableA where (fieldA,fieldB,fieldC) not in (select * from TableB);
答案 3 :(得分:0)
使用左连接左相关表的列不匹配返回空值,因此只过滤左表列,其中为null
SELECT a.fieldA, a.fieldB, a.fieldC
FROM TableA a
LEFT JOIN TableB b ON
a.fieldA = b.fieldA
AND a.fieldB = b.fieldB
AND a.fieldC = b.fieldC
WHERE a.fieldA = 1
AND a.fieldC = 1
AND ( b.fieldC is null OR b.fieldA is null OR a.fieldB is null)
或者您可以将NOT IN用于相同的条件
SELECT a.fieldA, a.fieldB, a.fieldC
FROM TableA a
WHERE a.fieldA = 1
AND a.fieldC = 1
AND (a.fieldA, a.fieldB, a.fieldC) NOT IN (
SELECT b.fieldA, b.fieldB, b.fieldC
FROM TableB b
WHERE b.fieldA = 1
AND b.fieldC = 1
)