SQL 加入并获得缺失记录的空输出

SQL Join and get null output for absent record

如何从以下两个 table(在 SQL Server 2019 中)获得输出:

在这里,只是需要交叉检查table A 和Table B 之间的记录ID 列。 如果 Table B 中不存在记录 ID,则需要将 'NULL' 插入输出 table .

我们已经在下面的查询中尝试过,但没有给出正确的输出。

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

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

提前致谢。

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

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

但是,表 B 中不存在 LineNo。因此,您可以使用 window 函数 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 似乎是一个保留关键字,因此我在所有这些关键字周围都添加了方括号。