直接连接两个 SQL table 或通过连接点 table
Joining two SQL tables directly OR via junction table
一段时间以来我一直在努力解决一个问题,在 S/O 上逐个线程检查都无济于事。我应该提到我正在构建一个 SQL 查询以用于 Crystal 报告。
我正在尝试将两个 table 连接在一起,它们可以通过连接点 table 连接 - 这可以通过 UNION 完成,但是 table 然后链接到自身和它考虑到所有潜在情况,可能会变得非常混乱。
假设我们有三个 table:t1、t2 和 t3。
我正在寻找一种快速且可重复使用的方式 "LEFT JOIN t1 & t2 directly OR LEFT JOIN via table3"。
这是我正在寻找的一个非常基本的组合:
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 上的 'parentId' 列,t1 和 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 |
+-------+--------+--------+-------+-------------+
这可能接近您的要求。但是,如果 t3.ID1
与 t2.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
一段时间以来我一直在努力解决一个问题,在 S/O 上逐个线程检查都无济于事。我应该提到我正在构建一个 SQL 查询以用于 Crystal 报告。
我正在尝试将两个 table 连接在一起,它们可以通过连接点 table 连接 - 这可以通过 UNION 完成,但是 table 然后链接到自身和它考虑到所有潜在情况,可能会变得非常混乱。
假设我们有三个 table:t1、t2 和 t3。
我正在寻找一种快速且可重复使用的方式 "LEFT JOIN t1 & t2 directly OR LEFT JOIN via table3"。
这是我正在寻找的一个非常基本的组合:
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 上的 'parentId' 列,t1 和 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 |
+-------+--------+--------+-------+-------------+
这可能接近您的要求。但是,如果 t3.ID1
与 t2.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