2013-11-15 65 views
0

不錯的簡單問題,不需要sql代碼,只是你的優先級知識。跨多個UNION使用多個CASE語句是否存在限制?

在我的一個通用表表達式中,我有5個聯合,在SELECT語句中有三列Col1,Col2和Col3(Example)。所有這三個字段都有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結果。我也知道在UNION中只使用了第一個引用的col名稱。我問,因爲我得到的值不符合CASE語句,所以我想知道是否在多個union語句的同一列上有多個情況是SQL Server解決衝突或問題。我想,聯合會之間的每個查詢只需追加一個記錄就可以了,好吧......這就是希望。

+3

'b.Col'會來自哪裏?我期望在'A'和'B'表之間看到'JOIN'或者相關性。 –

+0

你的例子與真實有多接近?你的第三塊看起來與第一塊相同。第四個塊與第一個塊沒有區別(返回同一列)。此外,對a.Co1 <> b.Col1和col3 ='A Value'評估爲真的行也會對第一個塊('a.Co1 <> b.Col1')評估爲真。 – Andrew

+0

給我們一個「不遵守CASE聲明」的例子。一個好的格式是「這是我得到」,但「這是我想要的」。順便說一下,你是否應該使用UNION ALL而不是UNION(UNION刪除重複項)? –

回答

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時可能對性能,我無法兩個詞後彼此相鄰由於防火牆限制。

+0

非常有趣,這是我原來做的,但不能得到它的工作。例子很快,也許你的洞察力可以使它工作,並減少表掃描的數量 –

0

您是否正在使用聯合來應用不同的案例邏輯?你可以把它合併成一個案例陳述(你只需要把最有限的案例放在第一位),像這樣:

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

是的,這就是爲什麼我使用UNION,即使使用不同的操作符,我必須使用它,因爲我跟蹤兩欄中多個字段的更改,一個CurrentValue和一個Previous Value。如果有多個字段被更改,我無法在一行中追蹤這個字段,所以我需要追加 –