【问题标题】:SQL Multiple Left-Join with multiple criteria具有多个条件的 SQL 多重左连接
【发布时间】:2014-04-05 05:39:13
【问题描述】:

我在这里总共处理 4 个表:

产品表: product_id, product_desc

数据 1 product_id, location_id, data1

数据 2 product_id、location_id、data2

数据 3 product_id、location_id、data3

我遇到的问题不是每个 product_id 或 location_id 都包含在每个数据表中。我的查询设法为第一个数据表正确提取数据,但不是在 data1 中不存在 product_id 或 location_id 但在 data2 中存在的情况下。我知道这是由于 on 条件返回到 data1,但我不确定如何在其中获取 location_nbr。我确实有另一个表列出了所有位置编号,但这些与 item 表的任何地方都没有关联,所以我无法加入。

select 
    item1.*
    ,coalesce(data1.location_id, data2.location_id, data3.location_id) as location_id
    ,data1.data1
    ,data2.data2
    ,data3.data3

from item1
    LEFT OUTER JOIN data1 AS data1
    ON data1.product_id = item1.ksn_id

    LEFT OUTER JOIN data2 AS data2
    ON data2.product_id = item1.ksn_id
    and data2.location_nbr = data1.location_nbr

    LEFT OUTER JOIN data3 AS data3
    ON data3.product_id = item1.ksn_id
    and data3.locn_nbr = data1.location_nbr

【问题讨论】:

  • 很难理解您在此处提出的要求,您将所有内容加入item1,但data2data3 加入data1 字段。如果值不在data1 中,您将使用什么标准来连接data2item1

标签: sql join teradata


【解决方案1】:

如果没有看到表的结构,很难推荐一个确切的解决方案,但是,根据描述,您应该研究 FULL OUTER JOINS,这将允许您包含在任何地方使用的所有 product_id 和 location_id。

【讨论】:

    【解决方案2】:

    有一个您想要的输出示例可能会有所帮助,但如果没有它,我认为 UNION 或 UNION ALL 可能会完成您正在寻找的内容:

    SELECT Item1.*
         , Data1.*
    FROM Item1
    LEFT JOIN 
         Data1
      ON Data1.ItemID = Item1.ksn_id
    UNION
    SELECT Item1.*
         , Data2.*
    FROM Item1
    LEFT JOIN 
         Data2
      ON Data2.ItemID = Item1.ksn_id
    UNION
    SELECT Item3.*
         , Data3.*
    FROM Item1
    LEFT JOIN 
         Data3
      ON Data3.ItemID = Item1.ksn_id;
    

    【讨论】:

      猜你喜欢
      • 2011-12-11
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 2013-11-09
      • 1970-01-01
      相关资源
      最近更新 更多