如何避免在Union ALL中排序

时间:2013-09-27 12:17:17

标签: sql sql-server

我的问题很简单,你如何避免UNION ALL查询的自动排序?

这是我的查询

SELECT * INTO #TEMP1 FROM Final

    SELECT * INTO #TEMP2 FROM #TEMP1 WHERE MomentId = @MomentId

    SELECT * INTO #TEMP3 FROM #TEMP1 WHERE RowNum BETWEEN @StartRow AND @EndRow

    SELECT * INTO #TEMP4 FROM (SELECT *FROM #TEMP3 UNION ALL SELECT *FROM #TEMP2) as tmp

    SELECT DISTINCT * FROM #TEMP4

我正在使用SQL Server 2008.我需要Union ALL执行就像一个简单的Concatenate,它不是!感谢你的帮助。

3 个答案:

答案 0 :(得分:1)

我认为你错误的是哪个操作实际上导致了排序。检查下面的代码,UNION ALL将导致排序。您可能正在查看DISTINCT操作,该操作使用排序(它对所有项目进行排序并消除重复项目)

CREATE TABLE #Temp1
(
    i int
)

CREATE TABLE #temp2
(
    i int
)

INSERT INTO #Temp1
SELECT 3 UNION ALL
SELECT 1 UNION ALL
SELECT 8 UNION ALL
SELECT 2 

INSERT INTO #Temp2
SELECT 7 UNION ALL
SELECT 1 UNION ALL
SELECT 5 UNION ALL
SELECT 6 

SELECT * INTO #TEMP3 
FROM (SELECT * FROM #Temp1 UNION ALL SELECT * FROM #temp2) X

答案 1 :(得分:1)

UNION ALL添加所有记录,其中UNION仅添加新的/不同的记录。

由于您使用UNION ALL并在不久之后使用DISTINCT,我认为您正在寻找UNION

SELECT * INTO #TEMP4 FROM
    (
     SELECT * FROM #TEMP3 
     UNION  --JUST UNION 
     SELECT * FROM #TEMP2
    ) AnotherTemp

或者您可以将其简化为

SELECT * INTO #TEMP4 FROM
        SELECT DISTINCT * 
        FROM Final
        WHERE MomentId = @MomentId OR RowNum BETWEEN @StartRow AND @EndRow

答案 2 :(得分:0)

我不熟悉SQL-Server,但你可能会理解我的想法

select *, 'A' tid, rownumber() tno from tableA
union all
select *, 'B', rownumber() from tableB
order by tid, tno;

这应该按照特定顺序获取tableA的所有记录,然后按特定顺序记录tableB的所有记录。