从#temp表中选择DISTINCT时,Order by子句不起作用

时间:2014-09-10 15:49:16

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

基本上,我有一个非常复杂的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
  2. 中有Last_NameFirst_name
  3. 由于要求,我无法在(Last_Name + First_Name)语句中合并SELECT。结果必须显示2个单独的列,Last_NameFirst_Name
  4. 首先,我想在INSERT语句中进行排序,因为我不想在每个ORDER BY语句中重写SELECT DISTINCT * FROM #temp_table子句。

2 个答案:

答案 0 :(得分:1)

  1. 您必须指定要选择的字段
  2. 如错误所示,订购商品必须出现在select子句中。
  3. 完成后,查询应该有效:

    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
    

    当您将输出写入表格时,无需在插入之前订购,因为订单将会丢失,正如您所注意到的那样。

答案 1 :(得分:0)

请阅读Aaron提供的评论和链接,但要使其适用于您的场景,请尝试以下方法:

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 
相关问题