【问题标题】:SQL Join and get null output for absent recordSQL Join 并为缺少的记录获取空输出
【发布时间】:2021-08-14 08:51:07
【问题描述】:

如何从下面两个表中获取输出(在 SQL Server 2019 中):

在这里,只需交叉检查表 A 和表 B 之间的 Record ID 列。 如果表 B 中没有记录 ID,则需要在输出表中插入“NULL”

我们在 Query 下尝试过这个,但没有给出正确的输出。

我们怎样才能得到更快更准确的输出。

SELECT A.ID, A.RecordId,A.LineNo, B.Value
FROM TableA A
LEFT JOIN TableB B ON A.RecordId = B.RecordId

提前致谢。

【问题讨论】:

  • 请添加更多关于“但是执行需要很长时间”和“没有给出正确的输出”的细节。 “很长一段时间”是多长时间?预期是什么?什么不是“正确的输出”?期望什么?
  • 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。
  • 输出不正确。
  • 你的预期示例没有意义。首先,您需要 AA,然后 RecordID100 为 NULL。但它始终存在于表 B 中。您必须指定您实际想要的内容。
  • 考虑到您的语句“如果表 B 中不存在记录 ID,则需要在输出表中插入 'NULL'”您的所有行都将在表 B 中匹配!

标签: sql sql-server join left-join sql-server-2019


【解决方案1】:

我正在从数据中对此进行猜测 - 但我认为这就是您想要的。

从表面上看,您基本上需要从 TableA 到 TableB 的 LEFT JOIN(正如您所拥有的),但不仅仅是在 RecordID 上 - 它还需要 LineNo。

但是,TableB 中不存在 LineNo。因此,您可以使用窗口函数 ROW_NUMBER() 创建它,例如,

SELECT [ID], 
    [RecordID], 
    [Value], 
    ROW_NUMBER() OVER (PARTITION BY [RecordID] ORDER BY [ID]) AS [LineNo]
FROM [TableB]

以上创建了以下结果。

ID  RecordID  Value  LineNo
1   100       AA     1
2   102       BB     1
3   102       BC     2
4   103       CC     1

现在,对于您的最终答案,请执行类似的 LEFT JOIN 但不是在您的联接中使用 TableB,而是使用带有附加列的子查询 - 然后在联接中包含附加列,例如,

SELECT [A].[ID], [A].[RecordId], [A].[LineNo], [B].[Value]
FROM [TableA] A
LEFT JOIN 
    (SELECT [ID], 
        [RecordID], 
        [Value], 
        ROW_NUMBER() OVER (PARTITION BY [RecordID] ORDER BY [ID]) AS [LineNo]
     FROM TableB
    ) B ON A.[RecordId] = B.[RecordId] AND A.[LineNo] = B.[LineNo]

这是一个DB_fiddle,其中包含数据和结果。

编辑:调整错别字 - 还要注意 LineNo 似乎是一个保留关键字,所以我在它们周围添加了方括号。

【讨论】:

  • 感谢您的回答。它工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多