T-SQL基于WHERE子句的结果的条件WHERE子句
我会先说,我的问题标题自己说明,这一切意味着应该是两个选择(或嵌套的,或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!'
我猜是这样的你是什么
后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
COALESCE !!!这将它带到我所需要的!!!,谢谢你们都指着我正确的方向,并带来了! - 所以我们没有完全一样的选择语句作为解决方案,但这是要走的路 – Spacemonkey
在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
值的行(可能是包含默认值的行)。
我在那里计数两个'SELECT' - 我不知道这是他们声称他们不能使用的,因为他们也是提到“嵌套”或者他们是否在谈论两个完全不同的SELECT语句。 –
“我被困在一个场景中,真的,我只能使用一个选择。” - 什么情况?为什么? –
*我只是希望魔术?* - 他们停止提供这些服务:D – GurV
基本上我怀疑我可以做我想要的一个单一的选择,但如果我不能,我将不得不废除整个事情,所以我伸出手去询问是否有人看到一种方法来做到这一点,我现在没有看到它......这是500行遗留代码场景。决定用多个选择来做并不是一个可行的选择。 – Spacemonkey