带有 if 条件的内连接
Posted
技术标签:
【中文标题】带有 if 条件的内连接【英文标题】:Inner join with if condition 【发布时间】:2012-02-22 21:01:42 【问题描述】:仅当 Table2 中存在 Table1 的 RepID 时,我才尝试使用内部连接编写查询,如果不存在则不连接 table2。使用我在下面使用的查询,如果 Table2 中不存在 repID,我不会从两个表中获取。这怎么可能?我正在使用 sql server 2005。提前谢谢!
Select * from Table1
inner join Table2 on Table1.RepID = Table2.RepID
where Table1.Date = @Date
order by Table1.Date desc
【问题讨论】:
你的意思是repID是否为NULL?SELECT * FROM Table1
应该很明显,来自Table2
的任何内容都不会出现在结果中,这就引出了一个问题:你为什么认为你想加入Table2
?建议:编写两个查询,每个条件一个(RepID
存在于两个表中,RepID
仅存在于Table1
),然后将UNION
放在一起,如有必要,为任何缺失值提供 DBA 认可的默认值。
【参考方案1】:
如果在联接的两侧都找到匹配项,则内部联接只会返回一行。如果您正在寻找将返回 Table1 中的所有行但在找到匹配项时仅返回 Table2 中的记录的东西,您需要一个左外连接:
select * from Table1 as t1
left outer join Table2 as t2
on t1.RepID = t2.RepID
where t1.Date = @Date
order by t1.Date desc
【讨论】:
谢谢贾斯汀!很好的解释。我相信我不会再忘记这件事了! 您的查询将返回来自Table1
的所有行,没有来自Table2
的行,如果在“右侧”找到多个匹配项,则left
侧的行将被复制。请向我解释这样的查询有何用处。
@onedaywhen 我在两个表上都没有超过一行的 RepID。有什么我还想念的吗,请告诉我。 :-)
@Ram:那么,连接什么都不做(除了开销)!你认为加入在做什么?【参考方案2】:
尝试“LEFT JOIN”而不是“INNER JOIN”。
单词“LEFT”的意思是“始终包括连接左侧表中的每条记录”,在本例中为 Table1,因为您将编写:Table1 LEFT JOIN Table2,而“Table1”在该表的左侧一对! :-)
【讨论】:
我不知道,感谢您的帮助! :-) 你能猜出 RIGHT JOIN 的作用吗? ;-) ;-) ;-)【参考方案3】:听起来你真正想要的是左外连接,不是吗?
【讨论】:
【参考方案4】:SELECT *
FROM Table1
LEFT JOIN Table2
ON Table1.RepID = Table2.RepID
WHERE Table1.Date = @Date
ORDER BY Table1.Date DESC;
【讨论】:
如果“外部”表中有多个匹配行,您的查询将返回来自Table1
的重复行。您可以通过将DISTINCT
添加到SELECT
子句来解决此问题,但最好还是完全删除连接。这让我想知道,这个答案的意义何在?【参考方案5】:
这就是外连接的用途。
Select * from Table1
left outer join Table2 on Table1.RepID = Table2.RepID
where Table1.Date = @Date
order by Table1.Date desc
【讨论】:
感谢外部联接的提示!以上是关于带有 if 条件的内连接的主要内容,如果未能解决你的问题,请参考以下文章
数据库的内连接外连接(左外连接右外连接全外连接)以及交叉连接(转)