SQL Server-消息145,但项在选择列表中

SQL Server-消息145,但项在选择列表中,sql,sql-server,Sql,Sql Server,下面的查询 select DISTINCT ID, field1, field2 from MyTable where field1 = 'myValue' OR field2 = 'myValue' order by case when field1 = 'myValue' THEN 1 else 2 end 给出此错误: 服务器:必须显示Msg 145,级别15,状态1,第1行按项目排序 如果指定了select DISTINCT,则在选择列表中 这看起来很奇怪,因为field1显然在s

下面的查询

select DISTINCT ID, field1, field2 
from MyTable 
where field1 = 'myValue' OR field2 = 'myValue'
order by case when field1 = 'myValue' THEN 1 else 2 end
给出此错误:

服务器:必须显示Msg 145,级别15,状态1,第1行按项目排序 如果指定了select DISTINCT,则在选择列表中

这看起来很奇怪,因为field1显然在select列表中

原因是什么?我该如何改变


(我确信有一个解决办法,但目前我想至少保留
order by
部分)

当使用
distinct
时,您不能在
order by
子句中使用与
select
子句中显示方式不完全相同的任何内容(除了ORDERBY子句中的序数位置,但我不建议使用它)

如果
select
子句包含大小写表达式,则可以在
order by
子句中使用相同的大小写表达式,但如果
order by
子句中缺少大小写表达式,则不能在
select
子句中使用大小写表达式,即使它只包含
select
子句中存在的列名

基本上有两种方法可以解决这个问题。 一种是用
组替换
不同的

select ID, field1, field2 
from MyTable 
where field1 = 'myValue' OR field2 = 'myValue'
group by ID, field1, field2 
order by case when field1 = 'myValue' THEN 1 else 2 end
另一个是对distinct使用派生查询或cte,在外部查询中使用order by(我将显示派生查询,因为另一个答案显示了cte选项):


您的查询中没有
WHERE
,只是编辑了表数据的预期输出?按
排序的条件表有列,而不是字段。@pரதீப் 我接受您的更正,将相应地编辑我的答案。@Pரதீப் 编辑。我想这会让我的答案变得有点麻烦,但至少现在它更准确了。谢谢!现在看起来好多了;)
select * 
from 
(
    select DISTINCT ID, field1, field2 
    from MyTable 
    where field1 = 'myValue' OR field2 = 'myValue'
) x
order by case when field1 = 'myValue' THEN 1 else 2 end