2011-06-10 105 views
0

我需要一個想法將以下「If's」條件轉換爲原始SQL語句。 (無動態SQL)將動態JOINS轉換爲SQL語句

Dim strVar1 as String, strVar2 as String, strVar3 as String, intSet Int32 

.Append("SELECT * FROM TABLE_A as A ") 
.Append("INNER JOIN TABLE_B as B ON A.Code=B.Code_A ") 

If strVar1.Length > 0 Then 
    .Append("LEFT JOIN TABLE_C as C ON C.Code=A.Code_C ") 
    .Append("LEFT OUTER JOIN TABLE_D as D on C.Code=D.Code_C AND D.Col1 IN (1,NULL) ") 
End If 

If strVar2.Length > 0 Or strVar3.Length > 0 Then 
    .Append("LEFT OUTER JOIN TABLE_E as E ON A.Code=E.Code_A ") 
    .Append("LEFT OUTER JOIN TABLE_F as F ON E.Col1=F.Col1 ") 
    .Append("INNER JOIN TABLE_G ON as G ON F.Code=G.Code_F AND G.Col1=1 ") 
End If 

Select Case intType 
    Case 1 , 2  
     If intSet <> -1 Then 
     .Append("LEFT OUTER JOIN TABLE_H H on A.code=H.code_A AND H.code_H=1 AND H.Pos=1 ") 
     Else 
     .Append("LEFT OUTER JOIN TABLE_H H on A.code=H.code_A AND H.Pos=1 ") 
     End If 
    Case 3 , 4 
End Select 
+0

intSet從哪裏來? 。附錄中的「With」在哪裏? – gbn 2011-06-10 07:38:39

+0

只是一句話。 'D.Col1 IN(1,NULL)'應該是'(D.Col1 = 1或者D.Col1 IS NULL)' – 2011-06-10 07:41:18

回答

0

您可以嘗試WHEN SQL構造! 邏輯:所有連接都將在那裏。但是,如果您想根據一些條件加入,把交叉表列中加入條款別人同桌列 喜歡的東西:

SELECT DISTINCT TABLE_A.* FROM TABLE_A as A 
INNER JOIN TABLE_B as B ON A.Code=B.Code_A 
LEFT JOIN TABLE_C as C ON C.Code= 
    CASE WHEN LEN(@strVar1)>0 
    THEN 
    A.Code_C -- join with your table 
    ELSE 
    C.Code -- join with itself to do nothing 
    END 
LEFT OUTER JOIN TABLE_D as D on C.Code= 
    CASE WHEN LEN(@strVar1)>0 THEN 
    D.Code_C AND D.Col1 IN (1,null) 
    ELSE 
    C.Code 
    END 

0

我不知道這很容易,或者甚至有可能將您的動態sql代碼轉換爲帶有參數的單個sql查詢。我感覺唯一的解決方案是爲您在測試中使用的每個值組合創建一個查詢。這是很多的疑問:如果我正確計算的話。

如果你的目標是加快你的查詢,我很肯定這會有所幫助:執行計劃不需要每次計算。但這是以更復雜的代碼爲代價的。