【问题标题】:Join tables and return 2 separate entries with NULL values连接表并返回 2 个具有 NULL 值的单独条目
【发布时间】:2012-09-06 23:31:43
【问题描述】:

我有 4 个表格,并希望以最有效的方式返回表格,其中键映射到正确的条目。

表 A 列:

[ SVC_PREFIX | SVC_CD | ... ]

表 B 列:

[ SVC_PREFIX | SVC_CD | SVC_ID |... ]

表 C 列:

[ SVC_ID | ... ]

表 D 列:

[ SVC_ID | ... ]

表 A 通过 SVC_PREFIX 和 SVC_CD 映射到表 B 然后表 B 负责通过 SVC_ID 检索表 C 和 D 表 C 和 D 几乎相同,只是表 D 比 C 少了几列 例如,C 可能有 isGood 和 isSilly,但 D 只有 isSilly。 是否可以检索条目,使得 D 将被提取为 isSilly 的 NULL 值,而 C 将带来相应的数据?

这是一个例子: 表 A 列:

[ SVC_PREFIX | SVC_CD | anotherData ]
[ 111 | 123 | AAA ]

表 B 列:

[ SVC_PREFIX | SVC_CD | SVC_ID ]
[ 111 | 123 | 007]

表 C 列:

[ SVC_ID | isGood | isHappy ]
[ 007 | Y | Y ]

表 D 列:

[ SVC_ID | isGood ]
[ 007 | Y ]

我要检索的数据:

[ SVC_PREFIX | SVC_CD | anotherData | SVC_ID | isGood | isHappy ]

实际数据

[ 111 | 123 | AAA | 007 | Y | Y ]
[ 111 | 123 | AAA | 007 | Y | NULL ]

我想将 C 和 D 的表格显示为单独的行。

目前,我有一个隐式连接,但没有达到我想要的结果......

SELECT *
FROM A,B,C,D
WHERE A.SVC_PREFIX = B.SVC_PREFIX
AND A.SVC_CD = B.SVC_CD
AND B.SVC_ID = C.SVC_ID
AND B.SVC_ID = D.SVC_ID
AND C.SVC_ID = D.SVC_ID

感谢您的帮助!

【问题讨论】:

  • 注意:数据库有键。和强类型。看来您可以加入 A&B,然后左加入 B&C 和 B&D(或 C&D)。
  • 这条记录是从哪里来的[ 111 | 123 | AAA | 007 | Y | NULL ]?我的意思是为什么会有null
  • @JohnWoo 从技术上讲,该记录不存在。但是,null 表明它来自表 D,其中它与 C 的数据基本相同,但在这种情况下它没有 isHappy

标签: sql join union


【解决方案1】:

您可以使用 UNION。我相信这可以在 SQL Server 中使用。

SELECT A.SVC_PREFIX, B.SVC_CD, A.anotherData, CD.SVC_ID, CD.isGood, CD.isHappy  
FROM A
JOIN B ON B.SVC_PREFIX = A.SVC_PREFIX AND B.SVC_CD = A.SVC_CD
JOIN
(
  SELECT SVC_ID, isGood, isHappy
  FROM C

  UNION

  SELECT SVC_ID, isGood, NULL AS isHappy
  FROM D
) AS CD ON CD.SVC_ID = B.SVC_ID

【讨论】:

  • 太棒了。我认为那完成了工作。最有帮助的是 JOIN(此处是另一个查询)和 NULL AS 命令,该命令将列默认为 NULL。
【解决方案2】:

试试 JOIN(内连接):

SELECT *
FROM A
JOIN B ON B.SVC_PREFIX = A.SVC_PREFIX
JOIN C ON C.SVC_ID = B.SVC_CD
JOIN D ON D.SVC_ID = C.SVC_CD

【讨论】:

  • 我尝试了该查询,但它似乎没有提取空值。
猜你喜欢
  • 2019-01-13
  • 2021-11-05
  • 2015-02-03
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多