【问题标题】:How to get rows from one or another joined table and then further to more joined tables depending on which first two tables were joined如何从一个或另一个连接表中获取行,然后根据连接的前两个表进一步获取更多连接表
【发布时间】:2016-10-22 03:06:01
【问题描述】:

我有三个表(a、b、c)和两个(b 和 c)需要连接才能从第一个表 a 中获取详细数据。但问题是我需要在一个查询中执行此操作。

如果我在同一个查询中加入两个表,则找不到任何记录,因为详细数据在 b 或 c 中,但从不在两者中。

为了进一步复杂化,我需要根据找到的记录进一步加入其他表(b2,c2)来自 b 或 c。

我正在使用 MS SQL。

我现在的查询是:

select a.*, b.name1, c.name1, b2.url, c2.url
  left join b on a.aID = b.aID
  left join c on a.aID = c.aID
  inner join b2 on b.bID = b2.bID
  inner join c2 on c.cID = c2.cID
where a.date > '9/1/2016'

我搜索了几天,但似乎没有人需要查询查询中的第四和第五张表,因此找不到任何类似的答案

有没有办法做到这一点?性能不是问题,因为在执行将始终限制表 a 记录的 where 子句后,记录数将少于 1,000。

【问题讨论】:

  • JOIN 只是INNER JOIN 的简写,因此重要的是要意识到您只是在执行 4 个内部连接。 INNER JOIN 仅抓取找到匹配项的记录。如果您想从一个表中选择所有值,然后在适用的情况下找到其他信息,您应该考虑改为使用LEFT JOIN
  • 我更新了代码以使用 LEFT JOIN,但查询仍然无法从 b2 和 c2 表中提取数据。实际上根本找不到任何记录。

标签: sql sql-server join


【解决方案1】:

一系列带有内连接的左连接作为子查询应该可以解决问题。子查询将 b/b2 和 c/c2 数据拉到一起,以便在左连接中使用 a:

select a.*, b.name1, c.name1, b2join.url, c2join.url
FROM a
LEFT JOIN b
    on a.aID = b.aID
LEFT JOIN c
    on a.aID = c.aID
LEFT JOIN 
        (SELECT b.aID, b.bID, b2.url
            FROM b
        INNER JOIN b2
            on b.bID = b2.bID) as b2join
    on b2join.aID = a.aID
LEFT JOIN 
        (SELECT c.aID, c.cID, c2.url
            FROM c
        INNER JOIN c2
            on c.cID = c2.cID) as c2join
    on c2join.aID = a.aID

【讨论】:

  • b2 和 c2 表上的键需要来自 b 和 c 表,因此在这种情况下,使用 b2 和 c2 表上的 a.aID 进行左连接将无济于事
  • @JunaidAli 我在发布答案后立即意识到 :-) 现在更新了答案以解决这个问题。
  • 这只是稍作改动。但我使用了 b2join.bID = b.bID (在 b2 表数据之后使用不同的列)。这不是“b2join.aID = a.aID”。类似的方式我得到了 c2 表数据。
【解决方案2】:

我认为 Left Join 可以做到这一点,至少在第一部分:

select a.*, b.name1, c.name1
  left join b on a.aID = b.aID
  left join c on a.aID = c.aID
where a.date > '9/1/2016'

当数据在b表中时c.name1为null,当数据在c表中时b.name1为null。

对于其他两个连接,不确定但左连接也可以工作。

【讨论】:

  • 左连接适用于表 b 和 c。在这种情况下,左连接不适用于 b2 和 c2 表
【解决方案3】:

我认为,获得相同结果的方法更简单:

select a.*, b.name1, c.name1, b2join.url, c2join.url
FROM a
LEFT JOIN b on a.aID = b.aID
LEFT JOIN c on a.aID = c.aID
LEFT JOIN b as b2join on b2join.bID = b.bID
LEFT JOIN a as c2join on c2join.cID = c.cID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多