我的问题很简单,你如何避免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,它不是!感谢你的帮助。
答案 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的所有记录。