直接连接两个SQL表或通过连接表连接

时间:2016-02-22 01:52:07

标签: sql-server join crystal-reports left-join

我一直在努力解决问题,在S / O线程之后检查线程无济于事。我应该提一下我正在构建一个用于Crystal Reports的SQL查询。

我正在尝试将两个表连接在一起,这些表可以通过联结表连接 - 这可以通过UNION进行,但是表然后链接到自身,并且它可能变得非常混乱,可以解决所有潜在的情况。

假设我们有三个表:t1,t2和t3。

我正在寻找一种快速且可重复使用的方式来说“直接LEFT JOIN t1& t2或通过table3连接LEFT”。

这是我正在寻找的一个非常基本的爆炸:

SELECT t1.ID, t2.ID
FROM   t AS t1
LEFT JOIN (
       t AS t2 ON t1.ID = t2.parentID OR (
       t AS t2 ON t1.ID = t3.ID1 AND t3.ID2 = t2.ID ))

这完全可能没有结束两个版本的t2吗? 我希望有一个功能,我只是不知道。

编辑:直接t2连接到t2和t1&上的'parentId'列。 t2是同一列的别名。

这是我想要的输出:

+-------+--------+--------+-------+-------------+
| t1.ID | t3.ID1 | t3.ID2 | t2.ID | t2.parentID |
+-------+--------+--------+-------+-------------+
|   001 | NULL   | NULL   | 004   | 001         |
|   002 | 002    | 003    | 003   | NULL        |
|   003 | NULL   | NULL   | NULL  | NULL        |
+-------+--------+--------+-------+-------------+

1 个答案:

答案 0 :(得分:1)

这可能接近您的要求。但如果t3.ID1t2.ID位于同一个域,则可能会出现问题

SELECT t1.ID, t2.ID
FROM   t1
LEFT JOIN t3
       ON t1.ID = t3.ID1
LEFT JOIN t2
       ON t1.ID = t2.ID
       OR t3.ID2 = t2.ID

所以也许你可以加入一些验证

SELECT S.ID1, COALESCE(S.ID2, T2.ID) 
FROM 
    (   SELECT t1.ID as ID1, t2.ID as ID2
        FROM   t1
        LEFT JOIN t2
               ON t1.ID = t2.ID 
               -- This step look weird if t1.ID = t2.ID you just print same ID twice.
    ) as S
 LEFT JOIN t3
        ON S.ID1 = t3.ID1
       AND S.ID2 IS NULL -- ONLY JOIN IF NOT MATCH ON FIRST QUERY 
 LEFT JOIN t2
        ON t2.ID1 = t2.ID