【问题标题】:Error: ORDER BY items must appear in the select list if SELECT DISTINCT is specified错误:如果指定了 SELECT DISTINCT,则 ORDER BY 项目必须出现在选择列表中
【发布时间】:2013-07-30 00:27:26
【问题描述】:

我收到错误:

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

对于这个查询:

SELECT DISTINCT 
    [Theme].[Name], [ThemeType].[Type] 
FROM 
    [Theme] 
LEFT OUTER JOIN 
    [ThemeType] ON [Theme].[ThemeTypeId] = [ThemeType].[PK_ThemeType]
JOIN 
    [ProductTheme] ON [ProductTheme].[ThemeId]=[Theme].[PK_Theme]
WHERE 
    ProductTheme.ProductID LIKE '%' 
    AND ProductTheme.ThemeId = Theme.PK_Theme 
    AND COALESCE([THEME].[THEMETYPEID], 'null') LIKE '%[0-9]%' 
ORDER BY 
    CASE WHEN [THEMETYPE].[TYPE] IS NULL 
           THEN 0 
           ELSE 1 
    END, [THEMETYPE].[TYPE]

我已经研究过了,不定义案例似乎是一个常见问题,但我确实这样做了。我做错了什么?

【问题讨论】:

  • @David:尝试将 ORDER BY 中的整个 CASE 语句也包含到 SELECT 中
  • 您的ThemeType.Type 列有哪些值?您能否在SELECTORDER BY 子句中使用ISNULL(ThemeType.Type, -99999) 之类的东西来确保NULLs 排在第一位?
  • 我不明白CASE 表达式的用途。 NULLs 不会先排序吗?
  • 所以您希望空值在输出中排序但不显示为 1 或 0?看来您应该将案例放在选择列表中,然后按此排序。
  • 您现有的查询根本没有按 [主题].[名称] 排序。

标签: sql sql-server


【解决方案1】:

不要使用 SELECT DISTINCT,而是使用 GROUP BY(匹配 cmets 中指定的排序顺序):

SELECT 
    [Theme].[Name], [ThemeType].[Type] 
FROM 
    [Theme] 
LEFT OUTER JOIN 
    [ThemeType] ON [Theme].[ThemeTypeId] = [ThemeType].[PK_ThemeType]
JOIN 
    [ProductTheme] ON [ProductTheme].[ThemeId]=[Theme].[PK_Theme]
WHERE 
    ProductTheme.ProductID LIKE '%' 
    AND ProductTheme.ThemeId = Theme.PK_Theme 
    AND COALESCE([THEME].[THEMETYPEID], 'null') LIKE '%[0-9]%' 
GROUP BY
    [Theme].[Name], [ThemeType].[Type] 
ORDER BY 
    CASE WHEN [ThemeType].[Type] IS NULL 
           THEN 0 
           ELSE 1 
    END, [Theme].[Name]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 2020-10-12
    相关资源
    最近更新 更多