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