【发布时间】:2020-04-05 15:03:34
【问题描述】:
在这个问题上需要帮助。
- 表 A:SR#、活动、状态、日期/时间(例如:100、创建、打开、2019-01-01)
- 表 B:SR#、SO#、活动、状态、日期/时间(例如:100、A100、更新、进行中、2019-01-02)
- 表 C:SO#、活动、状态、日期/时间(例如:A100、删除、取消、2019-01-03)
- 表 D:SO#、活动、状态、日期/时间(数据可能存在或不存在)
SR# 可能没有(null)或多个 SO,所以我需要一个包含 A、B、C 和 D 的最终表
SR#, SO#, activity, status, date/time
100, A100, Create, open,2019-01-01
100, A100, Update, in-progress, 2019-01-02
100, A100, Delete, Cancelled, 2019-01-03
注意:表 B/C/D 可能有数据,也可能没有数据。决赛桌应该是A、B、C和D。
我尝试了左连接,但它不起作用。它给出了所有表中的所有行。我正在寻找基于 SO# 合并所有表列。
SELECT DISTINCT
A.*, B.*, C.*, D.*
FROM B
LEFT JOIN A ON A.SR# = B.SR#
LEFT JOIN C ON C.SO# = B.SO#
LEFT JOIN D ON B.SO# = D.SO#
输出返回所有行。
感谢任何帮助。
谢谢。
【问题讨论】:
-
SO# 用作表 B 中的主键,应用作 C 和 D 的辅助键。左连接将引入 C 和 D 列中的所有数据,即使它们不存在于B 因为 SR# 键。我会评估连接。
-
“我尝试了左连接,但它不起作用。它给出了所有表中的所有行”你没有
WHERE所以o 怀疑这是可以预料的。这些预期结果的示例数据可能会帮助我们在这里为您提供帮助。 -
重新考虑这种数据库设计,因为不同的表不应该有相同的命名列。通过使用一个表来捕获相同的指标进行规范化。
标签: sql sql-server datatable left-join union