我首先要说的是,我的问题标题不言自明,这一定应该是两个选择(或嵌套,或者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!'
答案 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
值的行(可能是包含默认值的行)。