2011-12-10 46 views
1

我在網站上搜索了這裏。這個問題有很多答案。但無法找到我一直在尋找這個具體的問題:聯合SQL Server查詢和每個部分的不同順序?

可以說XXX,YYY,ZZZ有1列,3行:

1 
2 
3 

SELECT a FROM xxx order by a asc 
UNION 
SELECT f FROM yyy order by f desc 
UNION 
SELECT t FROM zzz order by t asc 

所以期望的結果集爲:

1 
2 
3 
3 
2 
1 
1 
2 
3 

UNION附近有錯誤的語法錯誤。

我知道的順序問題與工會的(並且知道如何解決它只有在整體ORDER BY是必需的。)

問:

我怎樣才能讓我的期望的輸出?

+0

可以顯示設定期望的結果的例子嗎? – Kenneth

+0

@Kenneth我沒有... –

+0

@RoyiNamir,你應該等待更多的答案,然後選擇最好的,謝謝你的時間。 –

回答

5

你必須子句應用爲了將整個工會,否則順序是不明確的:

SELECT a,1 as Pos,a as Ord from xxx 
UNION ALL 
SELECT f,2,-f from yyy 
UNION ALL 
SELECT t,3,t from zzz 
ORDER BY Pos,Ord 

然而,-f可能會覺得像一個骯髒的把戲實現了相反順序(或可能不完全,你想要什麼,如果NULL s的在內),所以你也可以這樣做:

SELECT a,1 as Pos,a as OrdAsc,0 as OrdDesc from xxx 
UNION ALL 
SELECT f,2,0,f from yyy 
UNION ALL 
SELECT t,3,t,0 from zzz 
ORDER BY Pos asc,Ord asc,OrdDesc desc 

我不明白爲什麼你不認爲它回答你的問題 - 也許是因爲結果集中的附加列?如果是這樣,你可以安排整個UNION是在一個子查詢:

create table #xxx (a int not null) 
create table #yyy (f int not null) 
create table #zzz (t int not null) 
insert into #xxx (a) select 1 union all select 2 union all select 3 
insert into #yyy (f) select 1 union all select 2 union all select 3 
insert into #zzz (t) select 1 union all select 2 union all select 3 

SELECT a FROM (
SELECT a,1 as Pos,a as Ord from #xxx 
UNION ALL 
SELECT f,2,-f from #yyy 
UNION ALL 
SELECT t,3,t from #zzz 
) t 
ORDER BY Pos,Ord 

結果:

a 
---- 
1 
2 
3 
3 
2 
1 
1 
2 
3 
+0

這不會給我:** 123321123 ** ....它會給我的整體順序,不幫助我... –

+0

@RoyiNamir - 你能更清楚爲什麼這*不是*你的答案題? –

+0

因爲我的愚蠢到不了解你的可愛的解決方案... ...現在讓我消化你在這裏做了什麼:)謝謝你。 –

0

事情要記住,而UNIONing

  • UNION讓你使用不同的SELECT聲明中的相同類型數據創建RESULTSET
  • RESULTSET是以領先(第一)SELECT語句的列名生成的。
  • 對於其他SELECT語句列數據類型應根據前導(第一個)SELECT語句進行匹配。
  • 對於ORDERing,其施加在RESULTSET,因此在UNION情況下,只允許ORDER BY在最後SELECT語句,但不對列名,根據前(第一)SELECT語句,所以下面的實施例是真實的:
  • 最後,因爲RESULTSETUNIONing與不同的表/源彙總所有數據到一列(根據第一個(領先的)SELECT聲明),因此您不能將ASCDESC應用於同一列。

SELECT a FROM xxx 
UNION 
SELECT f FROM yyy 
UNION 
SELECT t FROM zzz order by a asc 

錯誤根據您

SELECT a FROM xxx 
UNION 
SELECT f FROM yyy 
UNION 
SELECT t FROM zzz order by a asc, a desc