0

我的问题很简单,你如何避免 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 像简单的连接一样执行,但事实并非如此!感谢您在这方面的帮助。

4

3 回答 3

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
于 2013-09-27T12:24:00.300 回答
1

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

由于您正在使用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
于 2013-09-27T12:32:19.567 回答
0

我不熟悉 SQL-Server,但你可能明白我的想法

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

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

于 2013-09-27T12:23:58.547 回答