【问题标题】:Query to get records present in one table but NOT in the other [duplicate]查询以获取一个表中存在但不在另一个表中的记录[重复]
【发布时间】:2012-08-12 01:10:48
【问题描述】:

我有两张桌子: Teacher_lm 和老师。 这些表都有“teacher_email”列

我需要的是获取teacher_lm 中存在但teacher 中没有的电子邮件。

我有两种不同的方法来解决这个问题,但我不明白为什么其中一种没有给出任何结果,而另一种则返回很多行。

第一个:842 行

SELECT   DISTINCT lm.teacher_email
FROM       teacher_lm as lm
WHERE      NOT EXISTS (SELECT  * FROM teacher as lt
       WHERE lt.teacher_email = lm.teacher_email         
      )

第二个:没有结果

SELECT DISTINCT lm.teacher_email FROM
teacher_lm AS lm
WHERE lm.teacher_email NOT IN
(SELECT lt.teacher_email FROM 
teacher AS lt)

你能告诉我我在这里做错了什么吗?最好的方法是什么?

谢谢。

【问题讨论】:

    标签: mysql sql left-join exists


    【解决方案1】:

    “in”子查询中可能有一个 NULL。

    试试这个:

    SELECT DISTINCT lm.teacher_email
    FROM teacher_lm AS lm
    WHERE lm.teacher_email NOT IN (SELECT coalesce(lt.teacher_email, '')
                                   FROM  teacher AS lt) 
    

    顺便说一下,我认为第一个版本是mysql出于优化原因推荐的版本。

    【讨论】:

    • 谢谢!!你是对的:) 现在它给出了相同数量的结果。 IN 子查询的完成时间比 EXIST 长几年,所以我会选择那个。再次感谢:)
    • @Vika 。 . .以防万一您曾经使用过另一个数据库,EXISTS 比 IN 更好的特性是 mysql 特有的。在其他数据库中可能会也可能不会,但其他数据库引擎会更好地优化 IN 和 NOT IN。
    【解决方案2】:

    您的第一个查询正在处理整行的存在。

    第二个查询可能返回空值。我不认为 N​​OT IN 子句在存在空值的情况下效果很好。

    戈登的回答通过用空字符串替换空值来纠正这个问题。

    【讨论】:

      猜你喜欢
      • 2013-09-14
      • 2010-09-26
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 2012-08-16
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多