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

Fer*_*ito 2 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
Run Code Online (Sandbox Code Playgroud)

给出了这个错误:

服务器:如果指定了SELECT DISTINCT,则消息145,级别15,状态1,行1 ORDER BY项必须出现在选择列表中.

这看起来很奇怪,因为field1显然是在选择列表中.

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

(我确信有一个解决方法,但暂时我想保留至少order by部分)

Zoh*_*led 5

使用时distinct,你不能在order by子句中使用任何不完全相同的子句中的任何东西select(order by子句中的序数位置除外,但我不建议使用它).

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

基本上有两种方法可以解决这个问题.一是更换distinctgroup by:

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
Run Code Online (Sandbox Code Playgroud)

另一个是使用派生查询或cte用于distinct,并在外部查询中使用order by(我将显示派生查询,因为其他答案显示了cte选项):

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
Run Code Online (Sandbox Code Playgroud)

您可以在rextester上看到现场演示.