【问题标题】:Left-join EXCLUDING matching records?左连接排除匹配记录?
【发布时间】:2019-10-14 15:54:04
【问题描述】:

传统的左连接返回左表中的所有记录,包括匹配的记录:

我想用join排除匹配的记录,只返回左表不匹配的记录:

如下所示,是我目前想出的代码。
它使用WHERE 子句来清除匹配的记录——但这感觉有点不对。
这是最好的方法吗?或者有没有更好的独占加入方式?

SELECT L.col1 ,
       L.col2 ,
FROM leftTable L
LEFT JOIN rightTable R ON R.col1 = L.col1
WHERE R.id IS NULL ;

【问题讨论】:

  • 这是一个常见问题解答。在考虑发布之前,请始终使用谷歌搜索您的错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有或没有您的特定字符串/名称和站点:stackoverflow.com 和标签,并阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。 PS“左连接返回左表中的所有记录”这很糟糕,但很典型,因为左连接返回包含两个输入列的行。您试图说一些涉及左输入行是返回行的子行的内容。

标签: sql sql-server join left-join sql-server-2017


【解决方案1】:

LEFT JOIN 方法很好。它在许多数据库中进行了优化。个人更喜欢NOT EXISTS,因为我觉得更简洁:

SELECT L.col1, L.col2
FROM leftTable L
WHERE NOT EXISTS (SELECT 1 FROM rightTable R WHERE R.col1 = L.col1);

也就是说,逻辑在一个地方(NOT EXISTS 表达式),而不是分布在两个查询子句中。

【讨论】:

    【解决方案2】:

    使用Except解释

       Select * from table t LEFT JOIN 
         TABLE1 t1
       On t.id=t1.id
       Except
     SELECT * FROM TABLE1
    

    【讨论】:

    • MINUS 不是 SQL Server 中的关键字。也许你在想EXCEPT
    • 它是一个运算符供参考techonthenet.com/sql/minus.php
    • "MINUS 不是 SQL SERVER" 中的关键字:db<>FIddle:Msg 102 Level 15 State 1 Line 3 Incorrect syntax near 'MINUS'. 这并不是说它不是'不是其他 SQL 方言中的运算符,但是,它不是 T-SQL 中的运算符。
    • 事实上,您引用的那个链接甚至证实了这一点:"提示: 并非所有 SQL 数据库都支持 MINUS 运算符。它可以用于 Oracle 等数据库. 对于 SQL Server、PostgreSQL 和 SQLite 等数据库,请使用EXCEPT operator 执行此类查询。” OP 在此处标记了 SQL Server,而不是 Oracle。
    • 不,OP 根本没有在此处标记 Oracle。
    【解决方案3】:

    使用左连接方法并没有错,事实上它是标准方法,大多数人在某些情况下遵循这种方法来排除记录和增量插入

    【讨论】:

      猜你喜欢
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多