English 中文(简体)
只有当列值为真时才加入表格。
原标题:
  • 时间:2009-01-14 15:55:30
  •  标签:

我正在使用SQL Server 2005。我试图将2个表连接在一起,但仅当主表中的列值为真时。就像这样:

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

T1中有一个列值,它说明我是否必须使用T2中的值。我可以在where子句周围使用一个case,但它总是会连接到表,如果T1中的值为false,则没有值可以加入到T2中,因此select返回零行。

你不能在连接处加个外壳,所以我有点困扰...... 有人可以帮帮我吗?

最佳回答

戴夫·马克(Dave Marke)是对的,但更普遍来说...

条件连接是您的问题的答案,请尝试在网络上寻找一些资源,例如

将此翻译成中文:http://weblogs.sqlteam.com/jeffs/archive/2007/04/03/Conditional-Joins.aspx

将此翻译成中文:http://bytes.com/groups/ms-sql/641690-difference-condition-join-where。 http://bytes.com/groups/ms-sql/641690-difference-condition-join-where

根据表中的数据进行连接是非常强大的技术。

问题回答
select * 
from T1
join T2 
  on  T1.value = T2.value
  and T1.booleancolumn = 1
where T2.value2 =  variable2 
and T2.value3 =  variable3 ;

与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

请注意,我也将您的常数视为实变量。

也许我误解了你的问题,但这是我的猜测。

我认为您可以在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

与Dave所说的非常相似,尽管我会将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

我想知道与条件联接相关的性能考虑因素是否存在?这是否相当于像这样的UNION:

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 




相关问题
热门标签