【问题标题】:SQL LEFT JOIN for joining three tables but one with to exclude contentSQL LEFT JOIN 用于连接三个表但一个用于排除内容
【发布时间】:2016-11-29 23:56:04
【问题描述】:

我有 3 张桌子

  • 学生
  • FEES_PAID
  • 已暂停

我想从SUSPENDED获取已缴费但不是来自SUSPENDED的学生详细信息。

SELECT
    ID
FROM
    STUDENTS s
LEFT JOIN
    SUSPENDED p ON s.ID = p.ID
INNER JOIN 
    FEES_PAID f ON f.ID = s.ID
WHERE
    s.ID IS NULL

不幸的是,这不起作用。任何人都可以提出一个有效的查询吗?

提前致谢

【问题讨论】:

  • WHERE p.ID IS NULL? (这是为什么别名应该具有含义的名称的示例,以使其更清晰、更易于进行完整性检查和维护。)

标签: sql join left-join inner-join outer-join


【解决方案1】:

您需要检查LEFT JOIN 中是否缺少second 表。因此,您需要查看该表中的一列。将WHERE 更改为:

WHERE p.ID IS NULL

或者,使用NOT EXISTS:

SELECT s.ID
FROM STUDENTS s INNER JOIN
     FEES_PAID f
     ON f.ID = s.ID
WHERE NOT EXISTS (SELECT 1 FROM SUSPENDED p WHERE s.ID = p.ID);

请注意,对于这两个查询,您需要限定SELECT 中的ID 以指定它来自哪个表。

【讨论】:

  • 根据方言,NOT EXISTS 可能会稍微快一些或明显慢一些。 LEFT JOIN NOT NULL 在我的经验中似乎更普遍适用。
  • @MatBailie 。 . .为了清楚起见,我实际上建议了它。 OP 似乎对连接有点困惑,所以我认为将此逻辑移至 WHERE 子句将有助于他专注于连接。
【解决方案2】:

这应该可行:

SELECT
    s.ID
FROM
    STUDENTS s
LEFT JOIN
    SUSPENDED p
        ON s.ID=p.ID
INNER JOIN
    FEES_PAID f
        ON f.ID= s.ID
WHERE
    p.ID IS NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多