【问题标题】:select from database table rows that are not in another table从数据库表中选择不在另一个表中的行
【发布时间】:2014-09-19 02:46:48
【问题描述】:

我在 MYSQL 数据库中有一个“条目”表。我有另一个表记录这些条目的活动,条目的 id 作为外键。我想从我的第一个表中选择第二个表中没有的条目。

如何使用 SQL 来实现这一点?我是否必须遍历两个表并将每个条目与其他每个条目进行比较?有没有更简单的方法来做到这一点?

例如。我有一个包含条目数据列和用户名列的表。我有另一个表,其中有一个条目 id 列和一个用户 id 列。我想从我的第一个表中选择所有未出现在具有给定用户 ID 的第二个表中的条目。

提前谢谢。我已经为这个实验苦苦挣扎了一段时间。我想我必须以某种方式加入这两个表?

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    实现此目的的几种方法,NOT INNOT EXISTSLEFT JOIN / NULL 检查。这是NOT EXISTS

    SELECT *
    FROM FirstTable T
    WHERE NOT EXISTS (
        SELECT *
        FROM SecondTable T2 
        WHERE T.Id = T2.Id
        )
    

    【讨论】:

    • 你能澄清一下吗?
    • @user3667450 -- 有一个古老的争论,当使用EXISTS 时,你可以使用SELECT *SELECT 1。大多数现代 DBMS 实际上会为这些查询生成相同的执行计划。我更喜欢SELECT * 的可读性,但它们都同样有效。所以如果你愿意,你可以写...WHERE NOT EXISTS (SELECT 1...
    【解决方案2】:

    据我了解,您希望选择外键与其他表中的任何内容都不匹配的所有行。这应该可以解决问题:

    SELECT *
    FROM Data A
    RIGHT JOIN Entry B
    ON A.ID = B.ID
    WHERE A.ID IS NULL
    

    Here's a handy chart that illustrates how to use joins for stuff like this.

    你也可以使用 NOT IN,这个机制实际上更容易理解。

    SELECT *
    FROM Data A
    WHERE A.ID NOT IN (SELECT ID FROM Entry)
    

    【讨论】:

      猜你喜欢
      • 2012-02-12
      • 2014-01-01
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 2019-11-17
      • 2021-12-14
      相关资源
      最近更新 更多