【问题标题】:Inner join with if condition带有 if 条件的内连接
【发布时间】: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 认可的默认值。

标签: sql sql-server-2005


【解决方案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
    

    【讨论】:

    • 感谢外部联接的提示!
    猜你喜欢
    • 2014-11-01
    • 2015-09-19
    • 1970-01-01
    • 2021-03-21
    • 2014-11-17
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    相关资源
    最近更新 更多