2013-09-27 29 views
0

我的问题很简单,您如何避免UNION ALL查询的自动排序?如何避免在联盟中排序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像一个简单的串联,这是不执行!感谢您的帮助。

+0

如果你想避免相应的排序,以'联盟所有'。你需要把自己的东西。你需要什么排序? –

+0

为什么一个UNION ALL,紧随其后的是DISTINCT? –

回答

1

我认为你错误地指出了哪种操作实际上导致了排序。检查下面的代码,UNION ALL将而不是导致排序。您可查看不同的操作,它采用了排序(排序它的所有项目和消除重复)

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 
+0

哇!对不起这是我的错。我并不认为Distinct正在整理表格......谢谢你指出这一点! – user2822523

+1

+1我把你的例子放在[SQL小提琴](http://sqlfiddle.com/#!3/8a6b8/4)上供大家看。 – GarethD

+0

那么我的问题是,如何避免在DISTINCT中排序? – user2822523

0

我不熟悉SQL-Server中,但是你可能会得到我的想法

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

这应该让你TABLEA的所有记录在其特定的顺序,其次是tableB的所有记录在其特定的顺序。

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 
+0

不完全。在我的情况下,根据具体情况,联盟会产生4行或5行。但我必须返回5行。我希望这样发生。如果最终表中只有4行,则将另一行插入表中并返回,如果有5行,则按原样返回表。使用UNION不会产生预期的结果。所以我仍然在寻找解决方法 – user2822523