很简单的问题,不需要sql代码,只需要你的优先知识。
在我的一个公用表表达式中,我有5个联合,在SELECT语句中有三列,Col1,Col2和Col3(示例)。所有这三个字段都有一个CASE WHEN语句,但有不同的运算符和条件(这就是为什么我有这么多UNION,好像两个WHEN语句都是TRUE,SQl服务器会选择第一个,所以我附加了额外的行如果另一个条件为TRUE)。以下是一个例子
Select CASE WHEN a.Co1<>b.Col1 THEN a.Col
from Table A
UNION
Select CASE WHEN a.Co1=b.Col1 THEN b.Col
from Table A
UNION
Select CASE WHEN a.Co1<>b.Col1 THEN a.Col
from Table A
UNION
Select CASE WHEN a.Co1<>b.Col1 and col3 = 'A Value' THEN a.Col
from Table A
UNION
Select CASE WHEN a.Co1=b.Col1 and col3 = 'A Value' THEN a.Col
from Table A
我必须注意哪些限制和陷阱?由于CASE语句中有多个TRUE结果,我已经被警告了。我也知道在UNIONs中只使用了第一个引用的列名。我问,因为我得到的值不符合CASE语句所以我想知道在多个联合语句中同一个col上有多个案例是否存在冲突或SQL Server无法解决的问题。我想,如果收到一条记录,那么UNION之间的每个查询都会简单地追加,好吧......希望如此。
答案 0 :(得分:0)
很难从你的例子中看出你的实际逻辑是什么,但如果你实际上是在不同条件下多次从同一个表中拉出来的话,那么你可以通过将互斥条件组合在一起来减少表扫描的数量,例如前2个条件是互斥的,可以组合成一个扫描:
SELECT CASE WHEN a.Co1<>b.Col1 THEN a.Col
ELSE b.Col
END
FROM Table_1 a
JOIN Table_2 b
ON a.ID = b.SomeID
UNION
SELECT CASE WHEN a.Co1<>b.Col1 and col3 = 'A Value' THEN a.Col
WHEN col3 = 'A Value' THEN a.Col
END
FROM Table_3 a
JOIN Table_4 b
ON a.ID = b.SomeID
并尽可能利用UNION
与ALL
进行效果,但由于防火墙的限制,我无法将这两个字张贴在彼此旁边。
答案 1 :(得分:0)
你使用联盟只是为了应用不同的案例逻辑吗?你可以将它组合成一个case语句(你只需要把最具限制性的案例放在第一位),如下所示:
SELECT CASE
WHEN a.Co1 = b.Col1 and col3 = 'A Value' THEN a.Col
WHEN a.Co1 <> b.Col1 and col3 = 'A Value' THEN a.Col
WHEN a.Co1 <> b.Col1 THEN a.Col
WHEN a.Co1 = b.Col1 THEN b.Col
END
FROM Table A