【问题标题】:Display results where there ISN'T a match - SQL Server 2008显示不匹配的结果 - SQL Server 2008
【发布时间】:2015-10-20 15:07:43
【问题描述】:

我有以下查询显示两个表之间存在匹配的记录:

select DISTINCT ug.name, ug.payroll_no, esr.assignment from user_group AS ug
inner join esrtraining AS esr on ug.payroll_no = SUBSTRING(esr.assignment, 2, 8)

我该如何做相反的事情?例如显示“User_Group”中没有匹配项的名称?谢谢。

【问题讨论】:

    标签: sql database sql-server-2008


    【解决方案1】:

    使用 OUTER 连接而不是 INNER,然后在第二张表中不可为空的列的 WHERE 子句中查找 NULL:

    select DISTINCT ug.name, ug.payroll_no, esr.assignment 
    from user_group AS ug
    left join esrtraining AS esr on ug.payroll_no = SUBSTRING(esr.assignment, 2, 8)
    where esr.assignment is null
    

    这称为排除连接。

    【讨论】:

      【解决方案2】:

      您可以使用 NOT EXISTS 在相同的条件下执行此操作:

      select DISTINCT ug.name, ug.payroll_no
      from user_group AS ug
      Where Not Exists
      (
          Select  *
          From    esrtraining AS esr 
          Where   ug.payroll_no = SUBSTRING(esr.assignment, 2, 8)
      )   
      

      【讨论】:

      • 对于它的价值,虽然两种解决方案(在评论时)都可以工作,NOT EXISTS performs better than LEFT JOIN in SQL Server,所以这个解决方案得到了我的投票。或者更多基准测试 - Should I use NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT, or NOT EXISTS?
      • @GarethD,对性能概括要非常小心。 NOT EXISTS 在链接报告中测试的特定情况下表现更好(实际上要好得多),当然。但是,由于在WHERE 子句中使用了一个函数,因此 OP 的案例在查询方面并不是严格等效的,并且性能可能无论如何都会受到 OP 案例和报告中考虑的测试案例之间不同的数据特​​征的强烈影响你链接了。 测试性能总是最好的。
      • @JohnBollinger 我很欣赏你的观点,并同意测试总是最好的,但在这种情况下,它并不是真正的概括,它是 SQL Server 优化器中一个(相当)众所周知的缺陷它不能将反半连接与左连接一起使用,因此在进行过滤之前仍会检索所有匹配的记录。最坏的情况是使用NOT EXISTS 将导致与LEFT JOIN 相同的计划。谓词中的函数仅表示相关测试用例是我链接到的 Aaron Bertrand 文章中的第二个,外部表中没有可用的索引。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 2012-03-21
      • 1970-01-01
      相关资源
      最近更新 更多