【问题标题】:Order by clause doesn't work when Select DISTINCT from #temp table从 #temp 表中选择 DISTINCT 时,Order by 子句不起作用
【发布时间】:2014-09-10 15:49:16
【问题描述】:

基本上,我有一个非常复杂的 JOIN 语句,我想将结果临时存储在 #temp 表中,然后我需要将此 #temp 表重用于多个其他查询。这是我的示例代码:

INSERT INTO #temp_table
SELECT --some very complicated join statement
FROM --many tables
WHERE --some very complicated conditions
ORDER BY
CASE WHEN @orderBy = 'LNAME' THEN (Last_Name + First_Name) END,
CASE WHEN @orderBy = 'FNAME' THEN (First_Name + Last_Name) END

@orderBy will accept either 'LNAME' or 'FNAME' and cannot be NULL.

在这部分之前,一切正常。

然后,当我执行以下查询时:

SELECT DISTINCT * FROM #temp_table

我的结果表中绝对没有排序了。

我曾尝试在#temp_table 中进行排序,例如:

SELECT DISTINCT * FROM #temp_table
ORDER BY
CASE WHEN @orderBy = 'LNAME' THEN (Last_Name + First_Name) END,
CASE WHEN @orderBy = 'FNAME' THEN (First_Name + Last_Name) END

但它会给我一个错误,说“如果指定了 SELECT DISTINCT,则 ORDER BY 项目必须出现在选择列表中。”

注意事项:

  1. #temp_table 中有 Last_NameFirst_name
  2. 由于要求,我无法在SELECT 语句中组合(Last_Name + First_Name)。结果必须显示 2 个单独的列,它们是 Last_NameFirst_Name
  3. 最好,我想在INSERT 语句中进行排序,因为我不希望在我的每个SELECT DISTINCT * FROM #temp_table 语句中重写ORDER BY 子句。

【问题讨论】:

  • 您需要选择您想要成为 DISTINCT 的列
  • 选择不同的什么?,你想要哪些列?
  • 请看我上面编辑的查询。谢谢指出,我都需要。
  • DISTINCT *?什么?另请阅读thisthis。不要通过连接姓氏和名字来实现动态排序。想想叫 Bo Bridge 和 Bob Ridge 的人。

标签: sql-server sorting stored-procedures sql-order-by


【解决方案1】:
  1. 您必须指定要选择的字段
  2. 正如错误所说,订购的商品必须出现在 select 子句中。

完成后,查询应该可以工作了:

SELECT DISTINCT /*add here any field you want to display*/,
    First_Name,
    Last_Name,
    CASE WHEN @orderBy = 'LNAME' THEN (Last_Name + First_Name) END as Last,
    CASE WHEN @orderBy = 'FNAME' THEN (First_Name + Last_Name) END as First
FROM #temp_table
ORDER BY
Last, First

当您将输出写入表格时,无需在插入之前对其进行排序,因为您注意到该顺序将会丢失。

【讨论】:

  • 由于要求,我无法在SELECT 语句中组合(Last_Name + First_Name)。结果必须显示 2 个单独的列,它们是 Last_NameFirst_Name
  • 然后将它们添加到 select 子句中。已编辑。
  • 所以你的意思是:选择 (Last_Name + First_Name)、Last_Name、First_Name.... 类似这样的东西?
  • 现在我收到了Invalid column name 'last'Invalid column name 'first' 和原消息ORDER BY items must appear in the select list if SELECT DISTINCT is specified.
  • 您是否为case when 列设置了名称,如图所示?请注意,您还可以ORDER BY 选择子句中列的位置(即ORDER BY 1, 2,如果要排序的列位于位置 1 和 2)。
【解决方案2】:

请阅读 Aaron 提供的 cmets 和链接,但要使其适用于您的场景,请尝试以下操作:

DECLARE @orderBy NVARCHAR(5) = 'FNAME' --order by first name
SELECT
    [first_Name]
  , [Last_name]

FROM
    #temp_table
ORDER BY
    CASE WHEN @orderBy = 'LNAME' THEN ( [last_name] + SPACE(1) + [first_Name] )
         WHEN @orderBy = 'FNAME' THEN ( [first_Name] + SPACE(1) + [Last_name] )
    END 

【讨论】:

    猜你喜欢
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多