以下查询
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部分)
使用时distinct,你不能在order by子句中使用任何不完全相同的子句中的任何东西select(order by子句中的序数位置除外,但我不建议使用它).
如果您的select子句包含case表达式,则可以在order by子句中使用相同的case表达式- 但order by如果子句中缺少case表达式,则不能在子句中使用case表达式select,即使它只包含select子句中存在的列名称.
基本上有两种方法可以解决这个问题.一是更换distinct用group 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)