2013-07-24 19 views
10

Chcę dobry sposób, aby poprawić mój kod SQL, muszę użyć sprzężenia wewnętrznego, gdy warunek jest spełniony. Ja obecnie replikuje kod:SQL do wewnętrznego dołączyć, jeśli warunek spełnione

@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 

i chciałbym zrobić to w taki sposób, jak to:

@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 

edit: roztworu (dzięki @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

pokaż nam kod, który nie działa. dlaczego to nie działa, jaki jest twój błąd? może przykład niektórych danych –

+0

Możesz użyć dynamicznego sql – Elmer

+0

Możesz zbudować dynamiczne zapytanie na podstawie warunku i wykonać to zapytanie później za pomocą EXEC (zapytanie). –

Odpowiedz

10

Powinno to (w przybliżeniu) zrobić to samo:

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) 

Oczywiście oznacza to również, że wszelkie inne odniesienia do kolumn w ramach numeru systemTable muszą zostać zapisane, aby oczekiwać, że kolumny będą miały numer NULL.

+0

nie pomaga w moim przypadku, ale zachowuję twoją odpowiedź na przyszłe potrzeby. dzięki. – kobe

+0

+1 tak interesujące – Parado

+0

OK, poprawiłem odpowiedź i teraz działa dobrze. dzięki. wybrał cię. – kobe

2

Co z dynamicznym 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) 
Powiązane problemy