2017-02-25 169 views
-2

我会先说,我的问题标题自己说明,这一切意味着应该是两个选择(或嵌套的,或w/e);但是我陷入了真正的场景,我只能使用一个选择。真。T-SQL基于WHERE子句的结果的条件WHERE子句

的问题是相当简单,

允许采取以下简单的表格(接合)

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

基本上我想返回1行对于每个不同的含有甲&乙& C其中B具有两个表中的匹配(我将在下面展开)
足够简单,但如果行(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 

显然,现在的问题是,所有的“默认”行返回,我只希望T2.B IS NULL如果没有T1.B要返回= T2.B

编辑

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

对于那些想要完整的代码,我有足够的技巧来筛选所需要的而不是;你不想要所有表格的完整50列定义或全部sp的6个临时表格-_-

感谢大家的帮助; Tim在关于B的评论中提出了他的问题。解决方案:简单地添加一个备用(额外)C列,然后合并它,将B子句放入JOIN语句并使其成为LEFT JOIN,并然后重新加入它的表2,其中它的值,所以我有:

/****** 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!'  
+1

“我被困在一个场景中,真的,我只能使用一个选择。” - 什么情况?为什么? –

+1

*我只是希望魔术?* - 他们停止提供这些服务:D – GurV

+0

基本上我怀疑我可以做我想要的一个单一的选择,但如果我不能,我将不得不废除整个事情,所以我伸出手去询问是否有人看到一种方法来做到这一点,我现在没有看到它......这是500行遗留代码场景。决定用多个选择来做并不是一个可行的选择。 – Spacemonkey

回答

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 
+0

COALESCE !!!这将它带到我所需要的!!!,谢谢你们都指着我正确的方向,并带来了! - 所以我们没有完全一样的选择语句作为解决方案,但这是要走的路 – Spacemonkey

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值的行(可能是包含默认值的行)。

+0

我在那里计数两个'SELECT' - 我不知道这是他们声称他们不能使用的,因为他们也是提到“嵌套”或者他们是否在谈论两个完全不同的SELECT语句。 –