2013-09-27 58 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