【问题标题】:SQL Multiple Left Joins on Same Parent Key同一父键上的 SQL 多个左连接
【发布时间】:2019-08-25 05:16:51
【问题描述】:

我有 3 个相互连接的表:

  • TableA(ID、名称、金额)(1 行)
  • TableB(ID、标题)(3 行)
  • TableC(ID、名称、标题)(3 行)

查询:

Select *
from TableA a Left Join
     TableB b
     on a.ID = b.ID Left Join
     TableC c 
     on a.ID = c.ID and a.name = c.name

这会产生很多重复,因为第二个左连接正在加入第一个的结果。

例如第一个左连接为您留下 3 行 (1x3),然后第二个连接到此结果以获得 9 (3x3)。

如何生成一个结果,在每一行中清楚地列出 ID、名称、标题、金额? 例如:

TableA.ID, TableA.Name ,TableB.Title1, TableA.Amount
TableA.ID, TableA.Name ,TableB.Title2, TableA.Amount
TableA.ID, TableA.Name ,TableB.Title3, TableA.Amount
TableA.ID, TableA.Name ,TableC.Title1, TableA.Amount
TableA.ID, TableA.Name ,TableC.Title2, TableA.Amount
TableA.ID, TableA.Name ,TableC.Title3, TableA.Amount

我最初尝试将这些表连接到单独的表中,然后将它们联合在一起,这可行,但我认为必须有更简单的方法

【问题讨论】:

    标签: sql


    【解决方案1】:

    你会使用union all:

    select a.id, a.name, b.title, a.amount
    from TableA a Left Join
         TableB b
         on a.ID = b.ID 
    union all
    Select a.id, a.name, b.title, a.amount
    from TableA a Left Join
         TableC c
         on a.ID = c.ID and a.name = c.name
    

    【讨论】:

    • 按照这个逻辑,如果我在主表中有另一个条目连接到表 B 但没有连接到表 C,这将为每个 TableB.Title 生成 3 行,为 TableC.Title 生成另一行为 null对吗?
    • @Tolki 。 . .如果您希望一个表中的列不在另一个表中,那么您将在 other 表的查询中使用 null 显式填充它们。
    • @Tolki 。 . .您是否有理由接受在此答案后四分钟发布的答案,并且本质上是相同的? (除了这个关于amount 的来源是正确的。)
    【解决方案2】:

    只使用内连接(不需要左连接)与联合所有

    Select a.ID, a.Name ,b.Title, b.Amount
      from TableA a 
      join TableB b on a.ID = b.ID
    union all
    Select a.ID, a.Name ,c.Title, c.Amount
      from TableA a 
      join TableC c on a.ID = c.ID    
    

    【讨论】:

    • 如果我想包含那些在主表中但不在 TableB 或 TableC 中的那些,我应该在两者的外部左连接上再做一个联合吗?
    • @Tolki 是的,如果是这种情况,那么您需要考虑外连接,但由于您的示例输出不需要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多