从更多带有日期的表中进行左外连接

问题描述 投票:0回答:1

提前感谢您的帮助!

我有4张桌子:

A为主表,有唯一ID

B、C 和 D 是包含此 ID 和日期及其他信息的表。

我必须创建一个列表:

A.ID、A.info、B、C 或 D 中存在的日期 以及来自 B、C 和 D 的其他信息

示例:

表A

ID_A 信息A 及其他

1 汤姆

表B

日期 ID_A 信息B 及其他

20241001 1 20

20241005 1 30

20241006 1 40

表C

日期 ID_A infoC 及其他

20241001 1 个

20241002 1 年

20241006 1 z

表D

日期 ID_A infoD 及其他

20241001 1 abc

20241002 1 个cde

20241007 1 架

我需要这个结果:

ID 信息A 日期信息B 信息C 信息D

1 汤姆 20240101 20 x abc

1 汤姆 20240102 NoData 和 cde

1 汤姆 20240105 30 无数据 无数据

1 汤姆 20240106 40 z 无数据

1 汤姆 20240107 NoData NoData fgh

(虽然我写的是表格形式,但是最终显示的很马虎,所以我写的是NoData而不是空数据)

我可以使用左外连接连接这些表,但无法连接它们,因此结果中只有一个日期列,并且如果子表中的数据属于同一日期,则它们将仅位于一行中,因为子表不包含所有日期。

非常感谢!

sql join select left-join
1个回答
0
投票

您应该首先提取表 B、C 和 D 中特定 ID 的所有可用日期,然后根据 ID 和日期对各个表进行外连接。
像这样的东西:

SELECT          a.id,
                a.info,
                dates.date,
                b.info,
                c.info,
                d.info
FROM            a
JOIN            (SELECT id,
                        date
                 FROM   b
                 UNION
                 SELECT id,
                        date
                 FROM   c
                 UNION
                 SELECT id,
                        date
                 FROM   d
                ) AS dates
  ON            a.id = dates.id
LEFT OUTER JOIN b
             ON a.id = b.id
            AND dates.date = b.date
LEFT OUTER JOIN c
             ON a.id = c.id
            AND dates.date = c.date
LEFT OUTER JOIN d
             ON a.id = d.id
            AND dates.date = d.date

尚不清楚您使用的是什么 RDBMS,因此语法可能略有不同。

© www.soinside.com 2019 - 2024. All rights reserved.