如何在联合之间的SQL中放置ORDER BY子句
我想实现一个简单的SQL查询,它将返回一个排序列表。问题是,我把如何在联合之间的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
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