Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果指定了select DISTINCT,则ORDER BY项目必须出现在选择列表中。。。。。我花了好几个小时,但什么也没找到_Sql_Sql Server_Distinct_Case - Fatal编程技术网

Sql 如果指定了select DISTINCT,则ORDER BY项目必须出现在选择列表中。。。。。我花了好几个小时,但什么也没找到

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

下面是我的大型sql查询的一部分,我花了几个小时才找到问题的解决方案。 我的要求是只对RaceNumber上的记录进行升序排序,并在底部放置空记录

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
已经包括在组员中,这不重要。