使用另一个子查询对子查询中的数据进行排序?
Sort data within a subquery with another subquery?
我正在尝试使用 OUN.outcomeKey 对 OUN.note 列进行排序,因为
它现在的工作方式是把笔记放在错误的顺序(按字母顺序排序)。关于如何去做的任何想法?我一直在尝试使用其中的另一个子查询对数据进行排序,但我运气不佳(我没有过多的经验)。
这是我当前的查询:
SELECT DISTINCT OC.outcomeKey [Outcome Key], OC.outcome [Result],
STUFF((SELECT ','+' '+ OUN.note
FROM
Outcome AS OUT
JOIN OutcomeNote AS OUN
ON OUT.outcomeKey = OUN.outcomeKey
WHERE OUN.outcomeKey = OC.outcomeKey
GROUP BY OUN.note
FOR XML PATH ('')), 1, 1, '') [Outcome Note]
FROM Outcome AS OC
如有任何帮助或提示,我们将不胜感激!另外,如果需要更多信息,请告诉我。
您可以替换行
GROUP BY OUN.note
与线
ORDER BY OUN.outcomeKey
此外,由于连接以 ', ' 开头,您可能希望使用 1、2、'' 作为 STUFF 函数的附加参数。否则,[结果记录] 列中的值始终以 space.
开头
编辑:
顺便说一句,在为 [Outcome note] 列生成值的子查询中按 outcomeKey 对注释进行排序没有任何效果...因为每个子查询结果中的所有注释都将具有相同的 outcomeKey 值。 .
当然,您可以根据需要对任何列进行排序。也许您的 OutcomeNotes table 中还有其他列可以作为您的结果注释的有用排序列。
如果我误解了你的问题,请提供 Outcome 和 OutcomeNote tables 的定义,以及那些 tables 的演示群体和 desired/expected 查询结果,请.
编辑 2:
从 SQL Server 2017 开始,Transact-SQL 包含一个名为 STRING_AGG 的函数,它似乎在功能上(或多或少)等同于 MySQL' s GROUP_CONCAT 函数。使用这个函数,你的查询会变成这样:
SELECT
OUN.outcomeKey [Outcome Key],
OC.outcome [Result],
STRING_AGG(OUN.[Note], ', ') WITHIN GROUP (ORDER BY OUN.outcomeKey) [Outcome Note]
FROM
Outcome AS OC
JOIN OutcomeNote AS OUN ON OUN.outcomeKey = OC.outcomeKey
GROUP BY
OUN.outcomeKey,
OC.outcome;
当使用 SQL Server 2017 或 SQL Azure 时,这可能是更合适的选择,因为它不仅使查询更具可读性,而且还消除了使用 (way效率较低)XML-查询中的函数。
我过去也大量使用 XML 字段连接功能(您使用它的方式),但我注意到我的查询性能大幅下降(有时包含多达 10 个具有串联数据的列)。从那时起,我倾向于在 SQL Server 2017 环境之前选择 recursive common table expressions or scalar UDF with recursion approaches。
我正在尝试使用 OUN.outcomeKey 对 OUN.note 列进行排序,因为 它现在的工作方式是把笔记放在错误的顺序(按字母顺序排序)。关于如何去做的任何想法?我一直在尝试使用其中的另一个子查询对数据进行排序,但我运气不佳(我没有过多的经验)。
这是我当前的查询:
SELECT DISTINCT OC.outcomeKey [Outcome Key], OC.outcome [Result],
STUFF((SELECT ','+' '+ OUN.note
FROM
Outcome AS OUT
JOIN OutcomeNote AS OUN
ON OUT.outcomeKey = OUN.outcomeKey
WHERE OUN.outcomeKey = OC.outcomeKey
GROUP BY OUN.note
FOR XML PATH ('')), 1, 1, '') [Outcome Note]
FROM Outcome AS OC
如有任何帮助或提示,我们将不胜感激!另外,如果需要更多信息,请告诉我。
您可以替换行
GROUP BY OUN.note
与线
ORDER BY OUN.outcomeKey
此外,由于连接以 ', ' 开头,您可能希望使用 1、2、'' 作为 STUFF 函数的附加参数。否则,[结果记录] 列中的值始终以 space.
开头编辑:
顺便说一句,在为 [Outcome note] 列生成值的子查询中按 outcomeKey 对注释进行排序没有任何效果...因为每个子查询结果中的所有注释都将具有相同的 outcomeKey 值。 .
当然,您可以根据需要对任何列进行排序。也许您的 OutcomeNotes table 中还有其他列可以作为您的结果注释的有用排序列。
如果我误解了你的问题,请提供 Outcome 和 OutcomeNote tables 的定义,以及那些 tables 的演示群体和 desired/expected 查询结果,请.
编辑 2:
从 SQL Server 2017 开始,Transact-SQL 包含一个名为 STRING_AGG 的函数,它似乎在功能上(或多或少)等同于 MySQL' s GROUP_CONCAT 函数。使用这个函数,你的查询会变成这样:
SELECT
OUN.outcomeKey [Outcome Key],
OC.outcome [Result],
STRING_AGG(OUN.[Note], ', ') WITHIN GROUP (ORDER BY OUN.outcomeKey) [Outcome Note]
FROM
Outcome AS OC
JOIN OutcomeNote AS OUN ON OUN.outcomeKey = OC.outcomeKey
GROUP BY
OUN.outcomeKey,
OC.outcome;
当使用 SQL Server 2017 或 SQL Azure 时,这可能是更合适的选择,因为它不仅使查询更具可读性,而且还消除了使用 (way效率较低)XML-查询中的函数。
我过去也大量使用 XML 字段连接功能(您使用它的方式),但我注意到我的查询性能大幅下降(有时包含多达 10 个具有串联数据的列)。从那时起,我倾向于在 SQL Server 2017 环境之前选择 recursive common table expressions or scalar UDF with recursion approaches。