假设我有两个名为A的表(字段:id,phase,name)和B(字段:id,AID,APHASE,void)。
我需要显示A中的所有记录,除了A.id = B.AID和A.phase = B.APHASE和void = 0的记录。
环境是MySQL。
答案 0 :(得分:2)
SELECT
id, phase, name
FROM A
WHERE NOT EXISTS
(SELECT id FROM B WHERE AID=A.id AND APHASE=A.phase AND void=0)
答案 1 :(得分:2)
SELECT *
FROM `A`
LEFT JOIN `B`
ON `A`.`id` = `B`.`id`
WHERE NOT ( `A`.`id` = `B`.`AID` AND `A`.`phase` = `B`.`APHASE`
AND `void` = 0 )
或:
SELECT *
FROM `A`
LEFT JOIN `B`
ON NOT ( `A`.`id` = `B`.`AID`
AND `A`.`phase` = `B`.`APHASE`
AND `void` = 0 )
不保证第二个实际上有效,它只是出现在我的脑海中
答案 2 :(得分:1)
SELECT *
FROM A
WHERE NOT EXISTS
(
SELECT NULL
FROM B
WHERE b.aid = a.id
AND b.aphase = a.phase
AND b.void = 0
)
请注意,此查询将始终从A
完全1
或0
次返回每一行。
如果LEFT JOIN
不是A
,B (aid, aphase)
可以多次从UNIQUE
返回行。
这些查询具有不同的语义,因此选择正确的查询是有效性而非性能问题。
至于性能,MySQL
将始终使用A
作为主要表格,因为它不能以NESTED LOOPS
之外的其他方式进行连接。
由于EXISTS
会在找到第一个匹配记录后立即返回,EXISTS
查询将始终比LEFT JOIN
更有效(因为它至少不会迟于一个LEFT JOIN
),最多只能从A
返回一条记录。
答案 3 :(得分:0)
从A,B
中选择*,其中
not(A.id = B.AID和A.phase = B.APHASE和void = 0)
我老了:|