我在使用with a带回一DISTINCT
组真正的记录时遇到问题,其连接结果又被连接成一个逗号分隔的列表。ROW_NUMBER()
LEFT JOIN
FOR XML PATH
目标是在 Web 应用程序中实现分页,因为可以返回大量记录,并且每次只返回一个子集,具体取决于选择的页码。
考虑以下 SQL:
SELECT DISTINCT IndustryCode,
STUFF (
(SELECT ',' + FE_LocationCode
FROM tblLegacy_Codes i2
WHERE c.IndustryCode = i2.IndustryCode
FOR XML PATH(''))
,1,1,'') AS LegacyList
FROM Common_Clli c
LEFT JOIN tblLegacy_Codes legacy ON c.IndustryCode = legacy.IndustryCode
WHERE FE_LocationCode LIKE 'AUS%'
DISTINCT
它按预期带回了一个非常好的列表:
IndustryCode LegacyList
AUSTTX85 AUST.GET,AUST.LDD,AUST.UU4
AUSTTXTE AUST.TE,AUST.TEH
AUSUTX78 AUST.AX3
SCHWAS01 AUSC01C1,AUSC01UT
SZBGASAH AUSB01C1,AUSB01OB,AUSB01TA
SZBGASAI AUSB01SN,AUVI01SN,AUVI02SN
SZBGASAK AUSB03C1,AUSB03V1
但是 - 当 ROW_NUMBER 语法添加到上面查询的第一行时,它看起来像这样:
SELECT DISTINCT ROW_NUMBER() OVER(ORDER BY IndustryCode) AS rowNum, IndustryCode,...
结果现在包括每个 IndustryCode 的一行,因为 LegacyList 中有许多行,因为DISTINCT
现在当然包括 rowNum。在不包括整个结果集的情况下,以下是列表中的第一个 IndustryCode 所看到的内容,因为它有 3 个关联的子记录:
rowNum IndustryCode LegacyList
1 AUSTTX85 AUST.GET,AUST.LDD,AUST.UU4
2 AUSTTX85 AUST.GET,AUST.LDD,AUST.UU4
3 AUSTTX85 AUST.GET,AUST.LDD,AUST.UU4
当然分页的最终实现是能够包装所有提到的SQL
SELECT * FROM (
[ the SQL you've already seen ]
WHERE rowNum BETWEEN x and y
目前我不得不求助于在没有 ROW_NUMBER() 的情况下先执行 SQL 并将结果放入临时表中,然后从那里获取最终产品。不幸的是,这完全违背了通过每次只获取记录子集来最小化负载的意图。
我相当确信有一些我不知道的东西。这始终是一个安全的赌注。非常感谢您的帮助。
满足所有要求的最终产品最终是下面的 SQL。虽然提供的前 2 个解决方案都有帮助,但都没有解决不首先将查询的整个结果存放在临时样式表中的需要,无论该表是通用表表达式还是其他表。这个StackOverflow 线程让我得到了一个完整的解决方案。
SELECT RowNum, IndustryCode, FEList FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY IndustryCode) AS RowNum, IndustryCode, FEList
FROM
(
SELECT DISTINCT IndustryCode,
STUFF (
(SELECT ',' + FE_LocationCode
FROM tblLegacyCodes i2
WHERE c.IndustryCode = i2.IndustryCode
FOR XML PATH(''))
,1,1,'') AS LegacyList
FROM Common_Clli c
LEFT JOIN tblLegacyCodes legacy ON c.IndustryCode = legacy.IndustryCode
WHERE FE_LocationCode LIKE 'AUS%'
) subInner
) subOuter
WHERE RowNum BETWEEN x AND y