【问题标题】:SQL Server : left join - check for right table column value is nullSQL Server:左连接 - 检查右表列值是否为空
【发布时间】:2019-05-05 09:15:15
【问题描述】:

我有一个查询如下:

select --this select should always give me 1 record
    tbl1.Id, tbl1.Name, tbl1.Address, tbl2.relNo, 
    CASE WHEN tbl3.Comments IS NOT NULL THEN 1 ELSE 0 END AS 'Required'
from 
    table1 tbl1 
inner join 
    table2 tbl2 on tbl2.Id = tbl1.Id
left join -- This left join table gives me 5 records for one instance
    (select 
         R.Id, C.Comments
     from
         tblC C
     inner join 
         tblR R on R.Id = C.id) tbl3 on tbl3.Id = tbl2.Id

我想在我的左连接给出的行上写一个 CASE 语句来检查上面的空值,我的最终选择查询总是只返回 1 行。有没有办法检查我的左连接中的所有五个评论列值是否在上述查询中检查为 NULL?

【问题讨论】:

  • 总结您的案例陈述并按您的其他返回值分组?或者使用子查询。

标签: sql-server tsql join case


【解决方案1】:

我会走捷径,使用 COUNT() OVER PARTITION

CASE WHEN COUNT(*) OVER (PARTITION BY tbl3.Id)  =0 THEN 0 ELSE 1 END AS 'Required'

你必须DISTINCT你上面的输出。另一种选择是GROUP BY 并在HAVING 子句中过滤。

select --this select should always give me 1 record
     tbl1.Id, tbl1.Name, tbl1.Address, tbl2.relNo
From table1 tbl1 
inner join table2 tbl2 on tbl2.Id = tbl1.Id
left join (-- This left join table gives me 5 records for one instance
      SELECT R.Id,
             C.Comments
      FROM tblC C
      INNER JOIN tblR R on R.Id = C.id
 ) tbl3 on tbl3.Id = tbl2.Id     
 GROUP BY 
    Id, Name, Address, relNo
 HAVING 
    COUNT(*) = 5

【讨论】:

    【解决方案2】:

    这就是你要找的吗?

    (CASE WHEN (select count(tbl3.id) FROM tbl3 WHERE tbl3.Comments IS NULL) then 1 else 0 end) as 'RequiredVal'

    select --this select should always give me 1 record
         tbl1.Id, tbl1.Name, tbl1.Address, tbl2.relNo, 
         CASE WHEN tbl3.Comments IS NOT NULL THEN 1 ELSE 0 END AS 'Required'
    
         , (CASE WHEN (select count(tbl3.id) FROM tbl3 WHERE tbl3.Comments IS NULL) then 1 else 0 end) as 'RequiredVal'
    
    From table1 tbl1 
    inner join table2 tbl2 on tbl2.Id = tbl1.Id
    left join (-- This left join table gives me 5 records for one instance
          SELECT R.Id,
                 C.Comments
          FROM tblC C
          INNER JOIN tblR R on R.Id = C.id
     ) tbl3 on tbl3.Id = tbl2.Id
    

    【讨论】:

    • 我们可以在最终的选择内部查询中访问left join tbl3吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 2014-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多