T-SQL条件WHERE子句基于WHERE子句的结果

时间:2017-02-25 18:03:23

标签: sql sql-server tsql

我首先要说的是,我的问题标题不言自明,这一定应该是两个选择(或嵌套,或者w / e);但我真的陷入了一个场景,我只能使用一个选择。真。

问题很简单,

让我们采取以下简单表格(加入)

T1.A  T2.B   T2.C
____________________ 
3     6     'hello'   
3    NULL   'default1'   
4    NULL   'default2'   
5     6     'jack!' 

基本上我想为包含A& A的每个不同的A返回1行B& C其中B在两个表中都有匹配(i' ll将在下面展开)
很简单,但如果行(A)上没有匹配(在B上),那么我希望该行仍然返回默认行(B = NULL)

所以拿上面的表我想要

3     6     'hello'    
4    NULL   'default2'   
5     6     'jack!' 

到目前为止,我的选择看起来像这样,但我对如何获得我想要的结果感到难过:

  /****** Script for SelectTopNRows command from SSMS  ******/
SELECT T1.A, T2.B, T2.C  
FROM [Table] T1
JOIN [Table2] T2 ON T1.D = T2.D  
WHERE T1.B = T2.B OR T2.B IS NULL 
显然现在问题是所有人都默认'返回行,我只想要在没有T1.B = T2.B

的情况下返回T2.B IS NULL

修改

要澄清,D是表2的身份。
B是一个常见的列,实际上是第三个不需要的表的标识(作为一堆与问题无关的其他列,所以我没有发布它们)

对于那些想要完整代码的人来说,我有足够的技巧可以解决所需的问题,而不是;您不希望所有涉及的表的完整50列定义或完整sp与它的6个临时表-_-

感谢大家的帮助;蒂姆在关于B的评论中用他的问题向我指出了

解决方案:只需添加一个备用(额外)C列然后合并它,将B子句放入JOIN语句并使其成为LEFT JOIN,然后在表2中重新加入它的NULL,所以我有:

  /****** Script for SelectTopNRows command from SSMS  ******/
SELECT T1.A, T2.B, COALESCE(T2.C, T3.C) AS C  
FROM [Table] T1
LEFT JOIN [Table2] T2 ON T1.D = T2.D AND T1.B = T2.B 
JOIN [Table2] T3 ON T1.D = T3.D AND T3.B IS NULL 

给了我想要的结果:

3     6     'hello'     
4    NULL   'default2' 
5     6     'jack!'     

2 个答案:

答案 0 :(得分:0)

我猜这样的事情就是你的目标

SELECT    1.A,
          COALESCE(2.B, 3.B) AS B,
          CASE 
           WHEN 2.B IS NULL THEN 3.C 
           ELSE 2.C 
          END AS C
FROM      [Table] 1
LEFT JOIN [Table2] 2
ON        1.D = 2.D AND 1.B = 2.B
LEFT JOIN [Table2] 3
ON        1.D = 3.D AND 2.B IS NULL

答案 1 :(得分:0)

在SQL Server中,您可以使用outer apply

SELECT t1.A, t2.B, t2.C  
FROM [Table] t1 OUTER APPLY
     (SELECT TOP 1 t2.*
      FROM t2
      WHERE t1.D = t2.D AND
            (t1.B = t2.B OR t2.B IS NULL)
      ORDER BY (CASE WHEN t1.B = t2.B THEN 1 ELSE 2 END)
     ) t2;

结果集在第一个表中的每一行都有一行。第二个表中的列首先来自匹配的行,然后来自具有NULL值的行(可能是包含默认值的行)。