首页 > 解决方案 > 在 on 子句中使用“and”进行自连接

问题描述

假设我有这个查询:

SELECT 
      A.ID
    , case WHEN B.Col2 IS NULL  then 0 else b.Col2 end AS Newcol
FROM TableA as A
LEFT join TableA as B
    on A.ID = B.ID and B.col1 = 'Something'

ID 是唯一的。

我不认为在上面做一个 join 是必要的,我们可以简单地通过在 中使用 a 来选择相同的case when结果select

SELECT 
      ID
    , case WHEN Col1 != 'Something'  then 0 else Col2 end AS Newcol
FROM TableA 

标签: sqlsql-servertsql

解决方案


构建一个包含表中每种可能类型的值的演示表总是一个好主意,这样您就可以检查重写的结果是否相同。

Col1 is null如果或 if ,您的重写将不会返回相同的结果col1 ='Something' and col2 is null。但是,您可以这样做:

SELECT 
      A.ID
    , case WHEN (a.col1 <> 'Something' or a.col1 is null or a.col2 is null) then 0 else a.col2 end AS Newcol
FROM TableA as A

或(更简单)

SELECT 
      A.ID
    , case WHEN a.col1 = 'Something'  then coalesce(a.Col2,0) else 0 end AS Newcol
FROM TableA as A

(当然我假设 ID 是你的表的主键,我认为我从来没有遇到过一个没有 ID 列的表)


推荐阅读