2016-11-04 74 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;