复合加入返回SuperSet

时间:2016-08-25 11:08:13

标签: join sql-server-2012 data-warehouse data-vault

全晚,

我一直在讨论这个问题一段时间,由于某种原因,我似乎无法让我的逻辑按照我期望的方式返回。

我有3个数据表以及3个业务概念链接表。

  • 表1
  • 表2
  • 表3

规则:

  • 表1可以链接到表2
  • 表1可以直接链接到表3
  • 表1可以通过表2间接链接到表3

TableStructures 我尝试了一些公平的变化,但它似乎截断了记录。

SELECT
    *
FROM
            Table1          T1
INNER JOIN  Table1_to_Table2_Link   L1  on L1.T1_ID = T1.ID
RIGHT JOIN  TABLE2          T2  ON L1.T2_ID = T2.ID
INNER JOIN  Table2_to_Table3_Link   L2  ON L2.T2_ID = T2.ID
Right JOIN  Table3          T3  ON L2.T3_ID = T3.ID
INNER JOIN  Table1_to_Table3_Link   L3  on T1.ID = L3.T1_ID

有点尴尬的解释,但总结 我需要表1中的所有数据 并且只有表2和表3中的数据与表1直接/间接相关。表2和表3不一定要有相关的业务概念。

预期回报是;    enter image description here 任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

你是对的。事情并非那么简单。但是我可以通过以下查询获得所需的输出

SELECT
T1.*,
T2.*,
T3.*
FROM
        Table1  T1
LEFT JOIN  Table1_to_Table2_Link   L1  on T1.ID = L1.T1_ID
LEFT JOIN  TABLE2          T2  ON T2.ID = L1.T2_ID 
LEFT JOIN (
    SELECT T1_ID AS ID,T3_ID AS table3Id FROM dbo.Table1_to_Table3_Link
    UNION ALL
    SELECT T2_ID AS ID,T3_ID AS table3Id FROM dbo.Table2_to_Table3_Link
    ) S
    ON T1.ID = s.ID 
    OR t2.ID = s.id
LEFT JOIN dbo.Table3 T3 ON S.table3Id = T3.ID

希望它有所帮助。