2010-09-03 63 views
1

我想寫一個SQL查詢,我加入兩個表,並檢索幾列。一旦完成,基於兩個字段(源表枚舉,相應源表中的id),我需要檢索與源表中的id匹配的值。嵌套案例內的SQL查詢

的問題是,我不能參加所有的源表,並希望做這樣的事情:

Select 
    X.Col1, 
    X.Col2, 
    Y.Col1, 
    Y.Col2, 
    CASE 
    WHEN Y.TableID = 4 THEN Select t4.Col1 FROM TableFour t4 WHERE t4.id = Y.FileID 
    WHEN Y.TableID = 5 THEN Select t5.Col4 FROM TableFive t5 WHERE t5.id = Y.FileID 
    END 
FROM Table X INNER JOIN Table Y ON X.ID = Y.XID 

我可以保證所有的源表檢索的值將是相同的(即NVARCHAR )。

在CASE語句中嵌套SQL查詢似乎不起作用,我把它扔給你們。有這個問題的任何想法?

希望我充分解釋了這個問題。如果你不確定,請發表評論,以便我澄清它。

提前歡呼!

+0

MSSQL Server 2008的 – 2010-09-03 02:14:37

+0

我不明白什麼叫「不可能加入所有的源表」的意思是,你能不能解釋一下? – 2010-09-03 02:30:26

+0

@AlexKuznetsov:加入這些表可能會引入OP不希望出現在最終結果集中的附加行... – 2010-09-03 02:31:44

回答

1

我不明白你說的「無法加入所有源表」,你能否詳細說明一下? 我會使用外部聯接:

Select 
    X.Col1, 
    X.Col2, 
    Y.Col1, 
    Y.Col2, 
    COALESCE(t4.Col1 ,t5.Col4) 
    END 
FROM Table X INNER JOIN Table Y ON X.ID = Y.XID 
LEFT OUTER JOIN TableFour t4 ON t4.id = Y.FileID AND Y.TableID = 4 
LEFT OUTER JOIN TableFive t5 ON t5.id = Y.FileID AND Y.TableID = 5 
+0

該標準將限制'TABLE Y',而不是表格四或五...... – 2010-09-03 02:30:39

+0

不,外部連接條件中的標準不會過濾Y.請親自嘗試一下。 – 2010-09-03 02:52:06

0

我可能會寫這樣的功能:

CREATE FUNCTION dbo.GetVal 
(@tblNum int, @FileID int) 
RETURNS nvarchar(255) 
AS 
BEGIN 
    Declare @return nvarchar(255); 
    if @tblNum = 4 then 
    Select @return=t4.Col1 FROM TableFour t4 WHERE t4.id = @FileID; 
    else 
    if @tblNum =5 
     Select @return=t5.Col4 FROM TableFive t5 WHERE t5.id = @FileID; 
    return @return 
END; 

那麼你的選擇只是看起來像:

Select 
    X.Col1, 
    X.Col2, 
    Y.Col1, 
    Y.Col2, 
    dbo.GetVal(Y.TableID, Y.FileID) 
FROM Table X INNER JOIN Table Y ON X.ID = Y.XID 
+0

標量UDF非常慢。 – 2010-09-03 02:25:49

+0

這將工作,但IME的性能不會隨着大負載而擴展 - 它可以保證返回的每一行都有一個相關的子查詢,當您可以在主查詢中加入適當的表時...... – 2010-09-03 02:35:15

+0

我同意。 UDF是一個糟糕的選擇。 – ErikE 2010-09-03 03:33:00

3

使用支架固定到CASE表達式中封裝選擇:

Select X.Col1, 
     X.Col2, 
     Y.Col1, 
     Y.Col2, 
     CASE 
     WHEN Y.TableID = 4 THEN (Select t4.Col1 FROM TableFour t4 WHERE t4.id = Y.FileID) 
     WHEN Y.TableID = 5 THEN (Select t5.Col4 FROM TableFive t5 WHERE t5.id = Y.FileID) 
     END 
    FROM Table X 
    JOIN Table Y ON X.ID = Y.XID 

...但我想強調這是一個糟糕的設計選擇。你可以用LEFT JOIN代替:

Select X.Col1, 
      X.Col2, 
      Y.Col1, 
      Y.Col2, 
      CASE 
      WHEN Y.TableID = 4 AND t4.Col1 IS NOT NULL THEN t4.Col1 
      WHEN Y.TableID = 5 AND t5.Col4 IS NOT NULL THEN t5.Col4 
      END 
    FROM Table X 
    JOIN Table Y ON X.ID = Y.XID 
LEFT JOIN TABLEFOUR t4 ON t4.id = y.fileid 
LEFT JOIN TABLEFIVE t5 ON t5.id = y.fileid 
+0

完全忘了左連接,對於這個n00b問題抱歉抱歉。輕鬆修復。 :) – 2010-09-03 04:10:35