Sql 如果指定了select DISTINCT,则ORDER BY项目必须出现在选择列表中。。。。。我花了好几个小时,但什么也没找到
下面是我的大型sql查询的一部分,我花了几个小时才找到问题的解决方案。 我的要求是只对RaceNumber上的记录进行升序排序,并在底部放置空记录Sql 如果指定了select DISTINCT,则ORDER BY项目必须出现在选择列表中。。。。。我花了好几个小时,但什么也没找到,sql,sql-server,distinct,case,Sql,Sql Server,Distinct,Case,下面是我的大型sql查询的一部分,我花了几个小时才找到问题的解决方案。 我的要求是只对RaceNumber上的记录进行升序排序,并在底部放置空记录 SELECT DISTINCT TP.racenumber, TP.teamid, TP.teamname FROM tblteamprofile TP ORDER BY CASE WHEN TP.racenumber IS NULL THEN 1
SELECT DISTINCT TP.racenumber,
TP.teamid,
TP.teamname
FROM tblteamprofile TP
ORDER BY CASE
WHEN TP.racenumber IS NULL THEN 1
ELSE 0
end,
TP.teamid,
TP.teamname
有人能帮我吗?这只是我谦虚的请求。。。!请将缺少的订单按项目添加到选择列表中:
SELECT DISTINCT
TP.RaceNumber,
CASE WHEN TP.RaceNumber is null THEN 1 ELSE 0 END,
TP.TeamID,
TP.TeamName
FROM
tblTeamProfile TP
ORDER BY
CASE WHEN TP.RaceNumber is null THEN 1 ELSE 0 END,
TP.TeamID,
TP.TeamName
正如Factor Mystic在注释中敏锐地指出的那样,如果RDBMS允许在ORDER BY子句中重新使用别名,则可以简化查询:
SELECT DISTINCT
TP.RaceNumber,
CASE WHEN TP.RaceNumber is null THEN 1 ELSE 0 END AS RaceNumberFlag,
TP.TeamID,
TP.TeamName
FROM
tblTeamProfile TP
ORDER BY
RaceNumberFlag,
TP.TeamID,
TP.TeamName
也许应该按照以下顺序:
order by (case when tp.RaceNumber is NULL then 1 else 0 end),
tp.RaceNumber
如果您想按RaceNumber订购,为什么在查询中有TeamId和TeamName?问题是,如果该特定值不是
选择不同的查询中的选择列表的一部分,则数据库引擎不知道如何选择该值
如果不想选择列,您应该能够使用分组依据
而不是不同的
:
SELECT TP.racenumber, TP.teamid, TP.teamname
FROM tblteamprofile TP
GROUP BY TP.racenumber, TP.teamid, TP.teamname,
CASE WHEN TP.racenumber IS NULL THEN 1 ELSE 0 END
ORDER BY CASE WHEN TP.racenumber IS NULL THEN 1 ELSE 0 END,
TP.teamid, TP.teamname
您使用的rdbms是什么?@TimSchmelter它可能是其他副本的副本:另一个副本:在DRY的原因中,在select子句中为大小写
提供一个别名,并按别名的顺序引用它。谢谢您的评论。不幸的是,并不是所有的RDBMS都允许这样做。+1--SQL Server要求在使用distinct时,将select语句中使用的所有order by字段放入其中。回答得很好。@bernie,但sql server有,问题是指sql server。类似的策略是使用交叉应用将RaceNumberFlag推到子查询中。这允许您按该项目分组或对产品执行进一步的操作。这尤其适用于更复杂的语句。我对这一条投了赞成票,因为它需要对代码进行最小程度的修改,并且不会更改您的输出。我的答案涉及嵌套子查询,但我更喜欢它,所以我不想麻烦发布。干杯为什么您将案例
包括在组员中?@Yann39您是对的,如果TP.racenumber
已经包括在组员中,这不重要。