【问题标题】:Joining 4 tables in SQL Server在 SQL Server 中连接 4 个表
【发布时间】: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


【解决方案1】:

考虑对所有JOIN 对到表BUNION 查询,在每个SELECT 中明确定义相同的列:

SELECT B.[SR#], B.[SO#], A.[activity], A.[status], A.[date/time]
FROM B 
INNER JOIN A ON A.[SR#] = B.[SR#]

UNION

SELECT B.[SR#], B.[SO#], B.[activity], B.[status], B.[date/time]
FROM B 

UNION

SELECT B.[SR#], C.[SO#], C.[activity], C.[status], C.[date/time]
FROM B 
INNER JOIN C ON C.[SO#] = B.[SO#]

UNION

SELECT B.[SR#], D.[SO#], D.[activity], D.[status], D.[date/time]
FROM B 
INNER JOIN D ON D.[SO#] = B.[SO#]

【讨论】:

    猜你喜欢
    • 2013-06-30
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多