Xai*_*oft 63 sql t-sql sql-server
我将选择列表中的列添加到按顺序列表中,但它仍然给出了错误:
如果指定了SELECT DISTINCT,则ORDER BY项必须出现在选择列表中.
这是存储过程:
CREATE PROCEDURE [dbo].[GetRadioServiceCodesINGroup]
@RadioServiceGroup nvarchar(1000) = NULL
AS
BEGIN
SET NOCOUNT ON;
SELECT DISTINCT rsc.RadioServiceCodeId,
rsc.RadioServiceCode + ' - ' + rsc.RadioService as RadioService
FROM sbi_l_radioservicecodes rsc
INNER JOIN sbi_l_radioservicecodegroups rscg
ON rsc.radioservicecodeid = rscg.radioservicecodeid
WHERE rscg.radioservicegroupid IN
(select val from dbo.fnParseArray(@RadioServiceGroup,','))
OR @RadioServiceGroup IS NULL
ORDER BY rsc.RadioServiceCode,rsc.RadioServiceCodeId,rsc.RadioService
END
Run Code Online (Sandbox Code Playgroud)
Chr*_*tal 57
试试这个:
ORDER BY 1, 2
Run Code Online (Sandbox Code Playgroud)
要么
ORDER BY rsc.RadioServiceCodeId, rsc.RadioServiceCode + ' - ' + rsc.RadioService
Run Code Online (Sandbox Code Playgroud)
Joe*_*orn 48
虽然它们不是同一个东西,但在某种意义上,DISTINCT意味着GROUP BY,因为每个DISTINCT都可以使用GROUP BY重写.考虑到这一点,通过不在聚合组中的东西进行排序是没有意义的.
例如,如果您有一个这样的表:
col1 col2 ---- ---- 1 1 1 2 2 1 2 2 2 3 3 1
然后尝试像这样查询:
SELECT DISTINCT col1 FROM [table] WHERE col2 > 2 ORDER BY col1, col2
Run Code Online (Sandbox Code Playgroud)
这没有任何意义,因为每行最终可能有多个col2值.它应该用于订单?当然,在这个查询中,您知道结果不会那样,但数据库服务器无法提前知道.
现在,你的情况有点不同.您在DISTINCT子句中包含了子句中的所有列GROUP BY,因此乍一看它们都是分组的.但是,其中一些列包含在计算字段中.当您与distinct结合使用时,该DISTINCT指令只能应用于计算的最终结果:它不再知道有关计算源的任何信息.
这意味着服务器并不真正知道它可以依赖这些列.它知道它们已被使用,但它不知道计算操作是否可能导致类似于我上面的第一个简单示例的效果.
所以现在你需要做一些其他事情告诉服务器列可以用于订购.有几种方法可以做到这一点,但这种方法应该可以正常工作:
SELECT rsc.RadioServiceCodeId,
rsc.RadioServiceCode + ' - ' + rsc.RadioService as RadioService
FROM sbi_l_radioservicecodes rsc
INNER JOIN sbi_l_radioservicecodegroups rscg
ON rsc.radioservicecodeid = rscg.radioservicecodeid
WHERE rscg.radioservicegroupid IN
(SELECT val FROM dbo.fnParseArray(@RadioServiceGroup,','))
OR @RadioServiceGroup IS NULL
GROUP BY rsc.RadioServiceCode,rsc.RadioServiceCodeId,rsc.RadioService
ORDER BY rsc.RadioServiceCode,rsc.RadioServiceCodeId,rsc.RadioService
Run Code Online (Sandbox Code Playgroud)
Ton*_*ews 12
尝试以下方法之一:
使用列别名:
ORDER BY RadioServiceCodeId,RadioService
使用列位置:
订购1,2
您只能按实际出现在DISTINCT查询结果中的列进行排序 - 基础数据不可用于排序.
Distinct 和 Group By 通常会出于不同的目的执行相同的操作...它们都根据分组的列(或在 Select Distinct 子句中选择)在内存中创建一个“工作”表 - 然后填充该表查询读取数据时的工作表,仅当值指示需要这样做时添加新“行”...
唯一的区别是,在 Group By 中,工作表中还有用于任何计算聚合字段的附加“列”,例如 Sum()、Count()、Avg() 等,需要针对读取的每个原始行进行更新。Distinct 不必这样做......在特殊情况下,您仅通过 Group By 来获取不同的值(并且输出中没有聚合列),那么它可能是完全相同的查询计划......它查看这两个选项的查询执行计划并看看它做了什么会很有趣......
当然,如果您正在做的话,“不同”是提高可读性的方法(当您的目的是消除重复行,并且您不计算任何聚合列时)