LEFT JOIN显示不在Right表中的记录

时间:2013-04-10 12:50:49

标签: mysql sql left-join

我有两个表ECRDTL_del和ECRDTL_edit,我想只显示ECRDTL_del中不在ECRDTL_edit中的记录。 我曾尝试使用MYSQL左连接,但无法获得所需的结果。这是我目前的查询字符串:

SELECT a.*
FROM ECRDTL_del AS a
    LEFT JOIN ECRDTL_edit AS b ON b.Ecrno = a.Ecrno
WHERE b.Cylno <> a.Cylno

数据示例表和下面提到的这两个表中的预期结果:

ECRDTL_del:

Ecrno  Cylno
9090   8881
9090   8882
9090   8883
9090   8884

ECRDTL_edit:

Ecrno  Cylno
9090   8881
9090   8885
9090   8886
9090   8884

LEFT加入后预期的结果:

Ecrno  Cylno
9090   8882
9090   8883

3 个答案:

答案 0 :(得分:10)

从你的问题:

  

“......我想只显示ECRDTL_del中不在ECRDTL_edit中的记录。”

你很近,你只需要检查一下b.Ecrno IS NULL

SELECT a.* 
FROM   ECRDTL_del AS a 
       LEFT JOIN ECRDTL_edit AS b 
          ON a.Ecrno = b.Ecrno AND 
             a.Cylno = b.Cylno
WHERE  b.Ecrno IS NULL

输出

╔═══════╦═══════╗
║ ECRNO ║ CYLNO ║
╠═══════╬═══════╣
║  9090 ║  8882 ║
║  9090 ║  8883 ║
╚═══════╩═══════╝

答案 1 :(得分:3)

我通常会将EXISTS用于此类事情:

SELECT *
FROM ECRDTL_del as a
WHERE NOT EXISTS(
    SELECT *
    FROM ECRDTL_edit as b
    WHERE b.Ecrno = a.Ecrno
    AND b.Cylno = a.Cylno
)

找到匹配记录的那一刻,它就会停止,而IN之类的东西会继续搜索匹配的记录。

答案 2 :(得分:1)

select * from ECRDTL_del where Cylno not in (select Cylno from ECRDTL_edit)
相关问题