跨多个UNION使用多个CASE语句是否有限制?

时间:2013-11-15 19:55:44

标签: sql sql-server tsql case union

很简单的问题,不需要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之间的每个查询都会简单地追加,好吧......希望如此。

2 个答案:

答案 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 

并尽可能利用UNIONALL进行效果,但由于防火墙的限制,我无法将这两个字张贴在彼此旁边。

答案 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