2013-07-24 23 views
10

我想要一個改進我的sql代碼的好方法,當條件滿足時我必須使用內連接。我目前正在複製代碼:如果條件滿足,SQL會進行內連接

@SystemMerge bit 

if (@SystemMerge=1) 
BEGIN 
    SELECT 
     ....... 
     FROM myTable 
     INNER JOIN table ON table.param1=myTable.param1 
     INNER JOIN systemTable on systemTable.param2=myTable.param2 
    END 
ELSE 
    BEGIN 
     SELECT 
     ....... 
     FROM myTable 
     INNER JOIN table ON table.param1=myTable.param1 
    END 

,我想做到在這樣一個辦法:

@SystemMerge bit 
BEGIN 
    SELECT 
     ....... 
    FROM myTable 
    INNER JOIN table ON table.param1=myTable.param1 
    ***//the next 4 lines is not working, but this pseudo of what i want:*** 
    if (@SystemMerge=1) 
    begin 
     INNER JOIN systemTable on systemTable.param2=myTable.param2 
    end 

編輯: 解決方案(感謝@Damien_The_Unbeliever):

LEFT JOIN systemTable ON systemTable.param2=myTable.param2 
WHERE 
    ((@SystemMerge=1 AND systemTable.param2 is not null) 
    OR 
    (@SystemMerge=0 OR @SystemMerge is null)) 
+0

向我們顯示不起作用的代碼。爲什麼它不工作你得到的錯誤是什麼?也許是一些數據的一個例子 –

+0

您可能想要使用動態sql – Elmer

+0

您可以基於條件構建動態查詢並稍後使用EXEC(查詢)執行該查詢。 –

回答

10

這應該(近似)做同樣的事情:

SELECT 
    ....... 
    FROM myTable 
    INNER JOIN table ON table.param1=myTable.param1 
    LEFT JOIN systemTable on systemTable.param2=myTable.param2 and @SystemMerge = 1 
    WHERE (@SystemMerge = 0 OR systemTable.NonNullableColumn IS NOT NULL) 

當然,這也意味着必須編寫systemTable中對列的任何其他引用,以期望這些列爲NULL

+0

沒有幫助我的情況,但我保持你的答案爲未來的需求。謝謝。 – kobe

+0

+1 yeah interesting – Parado

+0

好的,我已經改進了答案,現在它運作良好。謝謝。挑選你。 – kobe

2

動態SQL如何?

declare @sel varchar(max) 

set @sel = ' SELECT 
     ....... 
     FROM myTable 
     INNER JOIN table ON table.param1=myTable.param1 
     ' 

if (@SystemMerge=1) 
    begin 
    set @sel = @sel+'INNER JOIN systemTable on systemTable.param2=myTable.param2' 
    end 

exec(@sel)