【问题标题】:Joining two SQL tables directly OR via junction table直接连接两个 SQL 表或通过联结表
【发布时间】:2016-02-22 01:52:07
【问题描述】:

一段时间以来,我一直在努力解决一个问题,在 S/O 上逐个检查线程无济于事。我应该提到我正在构建一个用于 Crystal Reports 的 SQL 查询。

我正在尝试将可能通过联结表连接的两个表连接在一起 - 这可以通过 UNION 来完成,但该表随后会链接到自身,并且考虑到所有潜在情况,它可能会变得非常混乱。

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

我正在寻求一种快速且可重复使用的方式来表达“直接左连接 t1 和 t2 或通过 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        |
+-------+--------+--------+-------+-------------+

【问题讨论】:

  • 一个很好的例子还包括表模式。样本数据和期望输出。请阅读How-to-Ask这里是START的好地方
  • 假设您将使用某种 sql 视图,然后在 CR 中使用它。如果您不希望使用 sql 视图,并使用 DbExpert 加入报表本身,我发现使用 Aliases 对表很有用。这样,您就可以完全独立地使用同一张表的 2 个实例。

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


【解决方案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

【讨论】:

  • @LiceRewis 我明白了,但您没有包含示例数据。您必须添加它,以便我可以根据该来源调整我的查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 2012-05-01
  • 1970-01-01
  • 2020-09-15
  • 2013-01-25
  • 1970-01-01
  • 2022-01-15
相关资源
最近更新 更多