2008-10-30 40 views
0

我有一個腳本可以從更大的表格中提取某些數據,特別是一個字段會定期變化,例如,根據標誌通過SQL從不同的表格中選擇

SELECT CASE @Flag WHEN 1 THEN t.field1 WHEN 2 THEN t.field2 WHEN 3 
     THEN t.field3 END as field, 
     ...[A bunch of other fields] 
FROM table t 

但是,問題是現在我想對數據做其他處理。我試圖找出最有效的方法。我需要通過某種方式讓旗幟通過,所以我知道我在談論正確的領域切分的數據。

我玩了一下(主要是看看會發生什麼)的一個可能的解決方案是將腳本的內容轉儲到一個表函數中,該函數將標誌傳遞給它,然後使用SELECT查詢函數的結果。我已經設法使它工作,但它顯着慢於...

顯而易見的解決方案,可能是處理器週期的最有效的使用:創建一系列緩存表,三個標誌值。然而,問題是找到某種方法從正確的緩存表中提取數據來執行計算。最明顯的,雖然不正確,反應會是這樣

SELECT CASE @Flag WHEN 1 THEN table1.field WHEN 2 THEN table2.field WHEN 3 
     THEN table3.field END as field, 
     ...[The various calculated fields] 
FROM table1, table2, table3 

不幸的是,很明顯,這創造了一個巨大的交叉連接 - 這不是我想要的結果的。

有誰知道如何將該交叉連接變成「只看x表」? (沒有使用動態SQL,這使得事情很難處理?)或者一個替代解決方案,這仍然是相當迅速?

編輯:無論這是一個很好的理由,我試圖實現的想法是沒有三個大部分相同的查詢,只有不同的表 - 這將不得不被編輯相同,每當改變邏輯。這就是爲什麼我避免了「有標誌完全分離」的事情到目前爲止......

+0

您花費在嘗試將其作爲一個查詢的努力將花在完成工作上。 – 2008-10-30 16:08:56

回答

0

一個簡單的解決方案,以及一個由同事建議:

SELECT CASE @Flag WHEN 1 THEN t.field1 WHEN 2 THEN t.field2 WHEN 3 
    THEN t.field3 END as field, 
    [A bunch of other fields], 
    @Flag as flag 
FROM table t 

然後做基礎上的最後一個領域的決定。簡單得多,而且可能本來應該發生在我身上。

5

我認爲你需要將@Flag從查詢中拉出來,然後用它來決定將三個單獨的SELECT語句中的哪一個跑。

+0

如果您的查詢非常簡單,就像您在那裏展示的一樣......這真的是最好的答案。 – 2008-10-30 10:32:48

0

您似乎將注意力集中在技術上而不是要解決的問題上。想一想每種情況下主表中的一個選擇 - 這就是你在這裏描述的方式,不是嗎?

3

對於FLAG的每個值,UNION ALL如何?

在第一位的where子句包括:

AND @flag = 1 

雖然有關運行不同的標記值不同的SELECT語句的評論也對我來說很有意義。

+0

用UNION ALL解決這個問題意味着重複大部分的SQL查詢,這正是瑪格麗特所說的她試圖避免的。 – 2008-10-30 17:24:43

相關問題