我想这样进行正确的连接:
我希望所有B都没有A,或者所有B都只有 A.type <> 0(如果它们只有一个A.type = 0,我就不要它们)
现在我有这个:
SELECT B.*
FROM A
RIGHT JOIN B ON A.ticket = B.id
WHERE A.id IS NULL
AND B.state NOT IN (3,4,10)
AND B.disable = 0
Run Code Online (Sandbox Code Playgroud)
没有理由使用RIGHT JOIN。对于大多数人来说,这比LEFT JOIN两个原因更令人困惑。首先,该FROM子句的读法是“从左到右”。ALEFT JOIN保留子句中第一个表中的所有行。RIGHT JOIN尚未见过的最后一个表中的。其次,该FROM子句是从左到右解析的,这在组合多个外连接时引入了一些微妙的问题。
接下来,你明确地说:
我想排除没有 A.Type = 0 的 B
这相当于:
我想包括没有 A.Type = 0 的 B
这不完全是外连接。我认为这更接近你想要的:
在你的情况下:
SELECT B.*
FROM B
WHERE NOT EXISTS (SELECT 1
FROM A
WHERE A.ticket = B.id AND A.Type = 0
) AND
B.state NOT IN (3, 4, 10) AND B.disable = 0;
Run Code Online (Sandbox Code Playgroud)