Sql 按嵌套选择排序

Sql 按嵌套选择排序,sql,sql-server,sql-order-by,Sql,Sql Server,Sql Order By,我使用下面的SELECT从数据库中获取数据 是否有方法按嵌套选择中的项目对结果排序? 我尝试了按B.ID下单,但这产生了一个错误 我的存储过程: SELECT ( SELECT B.ID, B.FirstName, B.LastName FROM Users B

我使用下面的SELECT从数据库中获取数据

是否有方法按嵌套选择中的项目对结果排序? 我尝试了按B.ID下单,但这产生了一个错误

我的存储过程:

SELECT      (
                SELECT      B.ID,
                            B.FirstName,
                            B.LastName
                FROM        Users B
                WHERE       B.UserNum = A.UserNum
                FOR XML     PATH(''), ELEMENTS, TYPE
            )
FROM        User_SolutionRole A
WHERE       A.Solution = 'SPR'
FOR XML PATH('users'), ELEMENTS, TYPE, ROOT('ranks')
如果我们可以将应用于main SELECT的唯一列以从中提取
ID
值,我们可以使用结果对行进行排序,如下所示:

<column_ref>.values('ID[1]', 'int') ASC
SELECT      (
                SELECT      B.ID,
                            B.FirstName,
                            B.LastName
                FROM        Users B
                WHERE       B.UserNum = A.UserNum
                FOR XML     PATH(''), ELEMENTS, TYPE
            ) AS users
FROM        User_SolutionRole A
WHERE       A.Solution = 'SPR'
FOR XML     PATH(''), ELEMENTS, TYPE, ROOT('ranks')
;
SELECT      (
                SELECT      B.ID,
                            B.FirstName,
                            B.LastName
                FROM        Users B
                WHERE       B.UserNum = A.UserNum
                FOR XML     PATH(''), ELEMENTS, TYPE
            ) AS users
FROM        User_SolutionRole A
WHERE       A.Solution = 'SPR'
ORDER BY    users.value('ID[1]', 'int') ASC
FOR XML     PATH(''), ELEMENTS, TYPE, ROOT('ranks')
;
您将获得相同的输出,但该列现在将有一个引用。这将是你迈向目标的第一步

您似乎只需要通过以下方式添加订单:

<column_ref>.values('ID[1]', 'int') ASC
SELECT      (
                SELECT      B.ID,
                            B.FirstName,
                            B.LastName
                FROM        Users B
                WHERE       B.UserNum = A.UserNum
                FOR XML     PATH(''), ELEMENTS, TYPE
            ) AS users
FROM        User_SolutionRole A
WHERE       A.Solution = 'SPR'
FOR XML     PATH(''), ELEMENTS, TYPE, ROOT('ranks')
;
SELECT      (
                SELECT      B.ID,
                            B.FirstName,
                            B.LastName
                FROM        Users B
                WHERE       B.UserNum = A.UserNum
                FOR XML     PATH(''), ELEMENTS, TYPE
            ) AS users
FROM        User_SolutionRole A
WHERE       A.Solution = 'SPR'
ORDER BY    users.value('ID[1]', 'int') ASC
FOR XML     PATH(''), ELEMENTS, TYPE, ROOT('ranks')
;
我个人的偏好是看起来更简单(对我来说)更清晰,但也同样有效。

如果我们可以将应用于main SELECT的唯一列以从中提取
ID
值,我们可以使用结果对行进行排序,如下所示:

<column_ref>.values('ID[1]', 'int') ASC
SELECT      (
                SELECT      B.ID,
                            B.FirstName,
                            B.LastName
                FROM        Users B
                WHERE       B.UserNum = A.UserNum
                FOR XML     PATH(''), ELEMENTS, TYPE
            ) AS users
FROM        User_SolutionRole A
WHERE       A.Solution = 'SPR'
FOR XML     PATH(''), ELEMENTS, TYPE, ROOT('ranks')
;
SELECT      (
                SELECT      B.ID,
                            B.FirstName,
                            B.LastName
                FROM        Users B
                WHERE       B.UserNum = A.UserNum
                FOR XML     PATH(''), ELEMENTS, TYPE
            ) AS users
FROM        User_SolutionRole A
WHERE       A.Solution = 'SPR'
ORDER BY    users.value('ID[1]', 'int') ASC
FOR XML     PATH(''), ELEMENTS, TYPE, ROOT('ranks')
;
您将获得相同的输出,但该列现在将有一个引用。这将是你迈向目标的第一步

您似乎只需要通过以下方式添加订单:

<column_ref>.values('ID[1]', 'int') ASC
SELECT      (
                SELECT      B.ID,
                            B.FirstName,
                            B.LastName
                FROM        Users B
                WHERE       B.UserNum = A.UserNum
                FOR XML     PATH(''), ELEMENTS, TYPE
            ) AS users
FROM        User_SolutionRole A
WHERE       A.Solution = 'SPR'
FOR XML     PATH(''), ELEMENTS, TYPE, ROOT('ranks')
;
SELECT      (
                SELECT      B.ID,
                            B.FirstName,
                            B.LastName
                FROM        Users B
                WHERE       B.UserNum = A.UserNum
                FOR XML     PATH(''), ELEMENTS, TYPE
            ) AS users
FROM        User_SolutionRole A
WHERE       A.Solution = 'SPR'
ORDER BY    users.value('ID[1]', 'int') ASC
FOR XML     PATH(''), ELEMENTS, TYPE, ROOT('ranks')
;

我个人的偏好是看起来更简单(对我来说)更清晰,但也同样有效。

按列数排序
按1排序
谢谢,我在尝试此操作时遇到一个错误:Msg 305,级别16,状态1,过程FetchUsersAll,第23行XML数据类型无法比较或排序,除非使用IS NULL运算符。请尝试
ORDER BY CAST(B.ID为NVARCHAR(100))
Nope:Msg 4104,级别16,状态1,过程FetchUsersAll,第23行无法绑定多部分标识符“B.ID”。然后我得到:Msg 207,级别16,状态1,过程FetchUsersAll,第23行列名称“ID”无效。请按该列的编号排序
ORDER BY 1
谢谢,尝试此操作时出现错误:Msg 305,级别16,状态1,过程FetchUsersAll,第23行无法比较或排序XML数据类型,除非使用IS NULL运算符。请尝试
ORDER BY CAST(B.ID AS NVARCHAR(100))
Nope:Msg 4104,级别16,状态1,过程FetchUsersAll,第23行无法绑定多部分标识符“B.ID”。然后我得到:Msg 207,级别16,状态1,过程FetchUsersAll,第23行无效列名“ID”。这实际上很好-我将使用交叉应用。非常感谢您的详细回复!这真的很好-我会用交叉申请。非常感谢您的详细回复!