2013-07-24 28 views
10

tôi muốn có một cách tốt để cải thiện mã sql của tôi, tôi phải sử dụng bên trong tham gia khi điều kiện được đáp ứng. Tôi hiện đang sao chép mã:SQL làm bên trong tham gia nếu điều kiện đáp ứng

@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 

và tôi muốn làm điều đó trong một cách như thế này:

@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 

chỉnh sửa: các giải pháp (nhờ @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

hiển thị cho chúng tôi mã không hoạt động. tại sao không phải là nó làm việc những gì lỗi của bạn nhận được? có thể là ví dụ về một số dữ liệu –

+0

Bạn có thể muốn sử dụng sql động – Elmer

+0

Bạn có thể tạo truy vấn động dựa trên điều kiện và thực hiện truy vấn đó sau bằng EXEC (truy vấn). –

Trả lời

10

Điều này nên (tương đương) thực hiện tương tự:

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) 

Tất nhiên, điều này cũng có nghĩa là bất kỳ tham chiếu nào khác đến các cột trong phạm vi systemTable phải được viết để mong đợi các cột đó là NULL.

+0

không giúp ích trong trường hợp của tôi nhưng tôi giữ câu trả lời cho các nhu cầu trong tương lai. cảm ơn. – kobe

+0

+1 yeah thú vị – Parado

+0

OK, tôi đã cải thiện câu trả lời và bây giờ nó hoạt động tốt. cảm ơn. đã chọn bạn. – kobe

2

Làm thế nào về sql động?

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) 
Các vấn đề liên quan