我需要执行可能导致多行的自联接,但我需要将联接限制为每条记录单行。当多行匹配连接条件时,只应使用具有最大 PK 的值行。这是一个简化的模式,假设:
CREATE TABLE #Records(
Id int NOT NULL,
GroupId int NOT NULL,
Node varchar(10) NOT NULL,
Value varchar(10) NULL,
Meta1 varchar(10) NULL,
Meta2 varchar(10) NULL,
Meta3 varchar(10) NULL
)
以下是一些示例插入:
INSERT INTO #Records VALUES(1,123,'Parent', '888', 'meta1', 'meta2', 'meta3')
INSERT INTO #Records VALUES(2,123,'Guardian', '789', 'meta1', 'meta2', 'meta3')
INSERT INTO #Records VALUES(3,123,'Parent', '999', 'meta1', 'meta2', 'meta3')
INSERT INTO #Records VALUES(4,123,'Guardian', '654', 'meta1', 'meta2', 'meta3')
INSERT INTO #Records VALUES(5,123,'Sibling', '222', 'meta1', 'meta2', 'meta3')
INSERT INTO #Records VALUES(6,456,'Parent', '777', 'meta1', 'meta2', 'meta3')
INSERT INTO #Records VALUES(7,456,'Guardian', '333', 'meta1', 'meta2', 'meta3')
概括地说,我希望返回的行数等于表中的记录数。我需要 Guardian 列中的 Parent 列。对于匹配的 GroupId,Parent 应等于基于 Id 的具有“Parent”节点的最新行。我需要 Guardian 相同,但节点应该是“Guardian”。结果如下所示:
Id GroupId Node Value Meta1 Meta2 Meta3 Parent Guardian
--- ---------- --------- --------- ------- ------- ------- ------- ----------
1 123 Parent 888 meta1 meta2 meta3 999 654
2 123 Guardian 654 meta1 meta2 meta3 999 654
3 123 Parent 999 meta1 meta2 meta3 999 654
4 123 Guardian 789 meta1 meta2 meta3 999 654
5 123 Sibling 222 meta1 meta2 meta3 999 654
6 456 Parent 777 meta1 meta2 meta3 777 333
7 456 Guardian 333 meta1 meta2 meta3 777 333
请注意,我现在部分工作,但它不限于最新值。当所有父值节点和监护值节点都具有相同的值时,它可以正常工作。我试图限制到 MAX,但失败了。查看此查询可能会影响您的判断,因此请不要犹豫,完全抛弃它。
SELECT #Records.*, Parent,Guardian
FROM #Records
LEFT JOIN (
SELECT MAX(Id) As ParentRow, GroupId, Value AS Parent
FROM #Records
WHERE Node = 'Parent'
GROUP BY GroupId, Value
) AS Parents
ON #Records.GroupId = Parents.GroupId
LEFT JOIN (
SELECT MAX(Id) As ParentRow, GroupId, Value AS Guardian
FROM #Records
WHERE Node = 'Guardian'
GROUP BY GroupId, Value
) AS Guardians
ON #Records.GroupId = Guardians.GroupId
提前致谢!