带有 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 条件的内连接的主要内容,如果未能解决你的问题,请参考以下文章

26.MySQL中的内连接INNER JOIN

数据库的内连接外连接(左外连接右外连接全外连接)以及交叉连接(转)

带有熊猫数据框的内连接循环,用于可能存在或不存在的各种组合[重复]

MySQL 表的内连和外连

MySql表的内连和外连

sql中的内连接使用问题