2016-11-04 122 views
0

比方說,我有如下表TSQL - 訂單查詢一個聯盟內

表1

Name  | Date Created 

John Doe | 09-10-2016 
Mike Smith | 08-05-2016 
Super Man | 09-07-2016 

表2

Name   Date_Created 
Super Mario | 02-01-2016 
James Bond | 05-01-2016 

表3

Name   Date_Created 
Mega Man | 12-25-2016 
Batman Jr | 12-05-2016 

如果我要加入所有這些表我一起使用聯盟

SELECT * FROM Table1 
UNION 
SELECT * FROM Table2 
UNION 
SELECT * FORM Table3 

這將產生:

Name   Date_Created 
John Doe | 09-10-2016 
Mike Smith | 08-05-2016 
Super Man | 09-07-2016 
Super Mario | 02-01-2016 
James Bond | 05-01-2016 
Mega Man | 12-25-2016 
Batman Jr | 12-05-2016 

是有辦法命令只有在表2中查詢「創建日期」 DESC使得結果顯示如下:

Name   Date_Created 
John Doe | 09-10-2016 
Mike Smith | 08-05-2016 
Super Man | 09-07-2016 

James Bond | 05-01-2016  <-- DESC May 01 2016 then Feb 01 2016 
Super Mario | 02-01-2016 

Mega Man | 12-25-2016 
Batman Jr | 12-05-2016 
+0

又該預期的輸出是什麼樣子? –

+0

你是不是錯過了一部分(即你想得到什麼)? – FDavidov

+0

@FDavidov更新了預期結果 –

回答

2

如果我想一起加入所有這些表,我會使用UNION

錯了。如果你想把它們全部結合起來,你的默認值應該是UNION ALL。當您想要刪除重複項時,只能使用UNION

第二個錯誤觀念:您不能訂購部分的結果集。結果集(如表格)代表無序集合,除非明確包含ORDER BY。所以,你可以訂購整件東西,但不是它的一部分。

你可以把結果放在一起,做時髦的事情排序:

SELECT t.* 
FROM ((SELECT t1.*, 1 as which FROM Table1 t1 
    ) UNION ALL 
     (SELECT t2.*, 2 as which FROM Table2 t2 
    ) UNION ALL 
     (SELECT t3.*, 3 as which FROM Table3 t3 
    ) 
    ) t 
ORDER BY which, 
     (CASE WHEN which = 1 THEN name END), 
     (CASE WHEN which = 2 THEN date_created END) DESC, 
     (CASE WHEN which = 3 THEN name END) DESC;