如何编写一个查询来显示表A中的记录而没有表B中的匹配记录?

时间:2009-09-07 15:14:59

标签: sql mysql join

假设我有两个名为A的表(字段:id,phase,name)和B(字段:id,AID,APHASE,void)。

我需要显示A中的所有记录,除了A.id = B.AID和A.phase = B.APHASE和void = 0的记录。

环境是MySQL。

4 个答案:

答案 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完全10次返回每一行。

如果LEFT JOIN不是AB (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)

我老了:|