【问题标题】:How to structure Left join and exclude matching ID. WHERE IS NULL clause not working如何构造左连接和排除匹配 ID。 WHERE IS NULL 子句不起作用
【发布时间】:2019-03-27 02:30:31
【问题描述】:

我想从 leftTable 中选择在 rightTable 中没有匹配但得到错误“WHERE 语法不正确”的行。这似乎是一个简单的连接,但我无法让它与“WHERE r.id IS NULL”一起使用。

我是否正确理解 LEFT JOIN / WHERE rightTable.id IS NULL 应该生成一个在 rightTable 中没有匹配项的 leftTable 项目列表?

  SELECT l.*
  INTO #temp_length
  FROM leftTable l
  LEFT JOIN rightTable r
        ON l.id = r.id
        WHERE r.id IS NULL
        AND l.start <= r.start
        AND l.end > r.start
        WHERE l.type IN ('A', 'B', 'C')
        AND l.id IN (SELECT id FROM lookupTable WHERE d_type = 'Z')
        AND l.disabled = 'N'
        AND r.latest = 'Y';

【问题讨论】:

  • 这是一个常见问题解答。在考虑发布之前,请始终在谷歌上搜索您的错误消息或您的问题/问题/目标的许多清晰、简洁和准确的措辞,有或没有您的特定字符串/名称,并阅读许多答案。如果您发布问题,请使用一个短语作为标题。 How to Ask
  • 了解左连接返回的内容:行上的内连接以及由空值扩展的不匹配左表行。作为左连接的一部分,始终知道您想要什么内连接。在左连接删除任何由空值扩展的行之后,内连接或需要右表列不为空的地方,即仅在行上留下内连接,即“将外连接变为内连接”。你有那个。
  • 该代码甚至无法解析。每个选择只能有一个 where 。 (不管那个特定的问题:)请在代码问题中给出minimal reproducible example--cut & paste & runnable code 加上所需的输出加上清晰的规范和解释。最小意味着将最少的问题代码添加到最少的工作代码中。因此,给出你所展示的最少代码,并在你出错的第一个地方提供最少的代码。 (调试基础。) PS 包括 DBMS 标记。

标签: sql left-join where isnull


【解决方案1】:

试试下面 - 你已经包含了一个 where 子句,而你使用了两个,并且在 ON 子句中移动了除 r.id IS NULL 之外的其他条件

SELECT l.*
  INTO #temp_length
  FROM leftTable l
  LEFT JOIN rightTable r
        ON l.id = r.id AND l.start <= r.start
        AND l.end > r.start and l.type IN ('A', 'B', 'C') AND l.id IN (SELECT id FROM lookupTable WHERE d_type = 'Z')
        AND l.disabled = 'N'
        AND r.latest = 'Y'
        WHERE r.id IS NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多