如何在联合之间的SQL中放置ORDER BY子句

如何在联合之间的SQL中放置ORDER BY子句,sql,stored-procedures,select,sql-order-by,union,Sql,Stored Procedures,Select,Sql Order By,Union,我想实现一个简单的SQL查询,它将返回一个排序列表。问题是,我把ORDER BY子句放在任何地方都会出现语法错误 SELECT fr.FunctionRoleID, fr.FunctionRoleInternalName FROM users u JOIN UserRoles ur ON ur.UserID = u.UserID JOIN Roles_FunctionRoles rfr ON rfr.RoleID = ur.RoleID JOIN

我想实现一个简单的SQL查询,它将返回一个排序列表。问题是,我把
ORDER BY
子句放在任何地方都会出现语法错误

SELECT 
    fr.FunctionRoleID, fr.FunctionRoleInternalName
FROM 
    users u 
JOIN 
    UserRoles ur ON ur.UserID = u.UserID
JOIN 
    Roles_FunctionRoles rfr ON rfr.RoleID = ur.RoleID
JOIN 
    FunctionRoles fr ON fr.FunctionRoleID = rfr.FunctionRoleID 
WHERE 
    u.UserName = @UserName
    AND u.Active = 1

UNION 

SELECT 
    fr.FunctionRoleID, fr.FunctionRoleInternalName
FROM 
    Roles r
JOIN 
    Roles_FunctionRoles rfr ON rfr.RoleID = r.RoleID
JOIN 
    FunctionRoles fr ON fr.FunctionRoleID = rfr.FunctionRoleID
WHERE 
    r.RoleName = 'Authenticated Users'
    AND @UserName IS NOT NULL
    AND LEN(@UserName) > 0
我想插入的内容:

ORDER BY fr.DisplayName ASC
编辑

如果我使用

SELECT * 
FROM 
     (
     [my initial query]
     )
ORDER BY 
    [COLUMN NAME] ASC
我收到以下错误消息:

“ORDER”附近的语法不正确。应为“AS”、“ID”或“QUOTED\u ID”

我不是在IDE前面,所以语法可能有点不正确,但这就是我的想法


e:是的,我想我应该把语法升级了……alias加了:)

在大多数数据库中,你只能在一个联合的末尾下一个
订单

因为联合会抽象出各个表别名,所以您只需列出列名。因此,省略
fr.

ORDER BY DisplayName
试一试


基本上,您是根据联合的结果进行选择,然后通过以下方式执行排序…注意,我使用“FunctionRoleInternalName”…您可以将其更改为“DiaplayName”,仅当您在联合查询中将其用作列别名时…例如。“FunctionRoleInternalName AS DisplayName”

ORDER BY子句需要放在Union的最后一个SELECT语句之后。

对于Union
ORDER BY
位于末尾,并应用于两个查询的组合结果;不能按未被联合中的两个查询选择的列排序

您需要做的是在两个查询中选择fr.DisplayName;那你就可以点了


如果您不希望显示名称成为输出列之一,请将整个内容嵌套在一个外部查询中,该查询只检索您想要的列。

您没有选择
DisplayName
,因此您不能使用它对从
联合派生的集合进行
排序。如果您想按它排序并从结果中忽略它

;WITH T (FunctionRoleID, FunctionRoleInternalName, DisplayName) AS (
    SELECT 
        fr.FunctionRoleID, fr.FunctionRoleInternalName, fr.DisplayName
    FROM users u
        JOIN UserRoles ur ON ur.UserID = u.UserID
        JOIN Roles_FunctionRoles rfr ON rfr.RoleID = ur.RoleID
        JOIN FunctionRoles fr ON fr.FunctionRoleID = rfr.FunctionRoleID 
    WHERE 
        u.UserName = @UserName
    AND 
        u.Active = 1

    UNION

    SELECT 
        fr.FunctionRoleID, fr.FunctionRoleInternalName, fr.DisplayName
    FROM 
        Roles r
        JOIN Roles_FunctionRoles rfr ON rfr.RoleID = r.RoleID
        JOIN FunctionRoles fr ON fr.FunctionRoleID = rfr.FunctionRoleID
    WHERE 
        r.RoleName = 'Authenticated Users'
        and @UserName is not null and LEN(@UserName) > 0
)
SELECT 
    FunctionRoleID, FunctionRoleInternalName
FROM T
    ORDER BY DisplayName

不需要子查询,尽管它不会伤害eitherOk,我只是尝试了这种方法,我得到了另一个错误消息:“ORDER”附近的语法不正确。应为'AS'、'ID'或'QUOTED_ID',请记住在派生表中添加别名。大多数RDBMS要求它缺少派生表的别名。这很好,但有一件事,您必须从最后一次选择中删除表别名
.fr
,只需使用列名
FunctionRoleID
即可完美工作+用于捕获该DisplayName的1不在选择列表中:)
SELECT * FROM (

SELECT  
    fr.FunctionRoleID, fr.FunctionRoleInternalName 



FROM  
    users u  
    JOIN UserRoles ur ON ur.UserID = u.UserID 
    JOIN Roles_FunctionRoles rfr ON rfr.RoleID = ur.RoleID 
    JOIN FunctionRoles fr ON fr.FunctionRoleID = rfr.FunctionRoleID  


WHERE  
    u.UserName = @UserName 
AND  
    u.Active = 1 


UNION  

    SELECT  
        fr.FunctionRoleID, fr.FunctionRoleInternalName 
    FROM  
        Roles r 
        JOIN Roles_FunctionRoles rfr ON rfr.RoleID = r.RoleID 
        JOIN FunctionRoles fr ON fr.FunctionRoleID = rfr.FunctionRoleID 
    WHERE  
        r.RoleName = 'Authenticated Users' 
        and @UserName is not null and LEN(@UserName) > 0 ) a

ORDER BY a.FunctionRoleInternalName ASC
;WITH T (FunctionRoleID, FunctionRoleInternalName, DisplayName) AS (
    SELECT 
        fr.FunctionRoleID, fr.FunctionRoleInternalName, fr.DisplayName
    FROM users u
        JOIN UserRoles ur ON ur.UserID = u.UserID
        JOIN Roles_FunctionRoles rfr ON rfr.RoleID = ur.RoleID
        JOIN FunctionRoles fr ON fr.FunctionRoleID = rfr.FunctionRoleID 
    WHERE 
        u.UserName = @UserName
    AND 
        u.Active = 1

    UNION

    SELECT 
        fr.FunctionRoleID, fr.FunctionRoleInternalName, fr.DisplayName
    FROM 
        Roles r
        JOIN Roles_FunctionRoles rfr ON rfr.RoleID = r.RoleID
        JOIN FunctionRoles fr ON fr.FunctionRoleID = rfr.FunctionRoleID
    WHERE 
        r.RoleName = 'Authenticated Users'
        and @UserName is not null and LEN(@UserName) > 0
)
SELECT 
    FunctionRoleID, FunctionRoleInternalName
FROM T
    ORDER BY DisplayName