2009-01-14 72 views
3

我正在使用SQL Server 2005.我試圖將兩個表連接在一起,但僅當主表中的列值爲真時。像這樣:僅當列值爲真時才加入表

select * from T1 
join T2 on T1.value = T2.value 
where T2.value2 = 'variable2' 
and T2.value3 = 'variable3' 

在T1中有一個列值說明是否必須使用T2中的值。我可以對where子句做一個例子,但它總是會加入到表中,並且如果T1中的值爲false,則T2中沒有值加入,所以select將不返回任何行。

你不能把一個案件圍繞加入,所以我有點卡住這個......任何人都可以幫忙嗎?

回答

3
select * 
from T1 
join T2 
    on T1.value = T2.value 
    and T1.booleancolumn = 1 
where T2.value2 = 'variable2' 
and T2.value3 = 'variable3'; 
0

也許我誤解了你的問題,但這是我的猜測。

認爲你可以在WHERE中使用一個case。

select * from T1 
join T2 on T1.value = T2.value 
where T2.value2 = case T1.useT2 when 'yes' then 'variable2' else T2.value2 END 
and T2.value3 = case T1.useT2 when 'yes' then 'variable3' else T2.value3 END 
1

與Dave發佈的內容類似,但我也讀到了這一點,表示您希望實際替換結果中的值。在這種情況下:

SELECT 
    COALESCE(T2.Value, T1.Value) AS Value, 
    COALESCE(T2.Value2, T1.Value2) AS Value2, 
    COALESCE(T2.Value3, T1.Value3) AS Value3 
FROM T1 
LEFT JOIN T2 ON T2.value = T1.value 
    AND T2.Value2= @Variable2 AND T2.Value3 = @Variable3 

請注意,我把你的常量當作真實變量。

0

非常相似,戴夫說,雖然我會把booleancolumn檢查到WHERE所以像這樣

SELECT * FROM T1 
INNER JOIN T2 
    ON T1.Value = T2.Value 
WHERE T2.Value2 = 'variable2' 
AND T2.Value3 = 'variable3' 
AND T1.booleancolumn = 1 
0

什麼,如果有的話,性能方面的考慮有關條件的數據連接,我不知道?是否相當於這樣的聯盟:

SELECT T1.* 
    FROM T1 
    WHERE T1.use_t2 = FALSE 
    AND T1.value2 = 'variable2' 
    AND T1.value3 = 'variable3' 
UNION ALL 
SELECT T2.* 
    FROM T1 JOIN T2 ON T1.value = T2.value 
    WHERE T1.use_t2 = TRUE 
    AND T2.value2 = 'variable2' 
    AND T2.value3 = 'variable3' 
相關問題