当前位置:  开发笔记 > 数据库 > 正文

如果指定了SELECT DISTINCT,则ORDER BY项必须出现在选择列表中

如何解决《如果指定了SELECTDISTINCT,则ORDERBY项必须出现在选择列表中》经验,为你挑选了3个好方法。

我将选择列表中的列添加到按顺序列表中,但它仍然给出了错误:

如果指定了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

Chris Van Op.. 57

试试这个:

ORDER BY 1, 2

要么

ORDER BY rsc.RadioServiceCodeId, rsc.RadioServiceCode + ' - ' + rsc.RadioService

可能是一个好主意,以扩展其原因 - 特别是,当在计算字段中使用时,列没有明确标识的事实. (11认同)

想知道snytax ORDER BY 1,2是什么. (4认同)


Joel Coehoor.. 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

这没有任何意义,因为每行最终可能有多个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


Tony Andrews.. 12

尝试以下方法之一:

    使用列别名:

    ORDER BY RadioServiceCodeId,RadioService

    使用列位置:

    订购1,2

您只能按实际出现在DISTINCT查询结果中的列进行排序 - 基础数据不可用于排序.



1> Chris Van Op..:

试试这个:

ORDER BY 1, 2

要么

ORDER BY rsc.RadioServiceCodeId, rsc.RadioServiceCode + ' - ' + rsc.RadioService


可能是一个好主意,以扩展其原因 - 特别是,当在计算字段中使用时,列没有明确标识的事实.
想知道snytax ORDER BY 1,2是什么.

2> Joel Coehoor..:

虽然它们不是同一个东西,但在某种意义上,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

这没有任何意义,因为每行最终可能有多个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



3> Tony Andrews..:

尝试以下方法之一:

    使用列别名:

    ORDER BY RadioServiceCodeId,RadioService

    使用列位置:

    订购1,2

您只能按实际出现在DISTINCT查询结果中的列进行排序 - 基础数据不可用于排序.

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有