2011-06-16 33 views
2

我有多个在每个表中添加了相同的date_time字段的表。在完成所有表的联合之后,我想按最近的一个对它们进行排序。但查询会告诉我,我必须添加一个表名称像videos.date_time而不是ORDER BY date_time。我怎样才能构建查询,以便它不知道哪个date_time字段?如何做一个不知道排序字段的查询?

+3

你的SQL的一些示例将非常有帮助 – 2011-06-16 23:59:02

回答

4

除非您使用的是SQL Server的TOP指令等专有功能,否则Order By in Union查询始终位于底部并始终适用于整个查询。例如。

Select Col1, date_time 
From Table1 
Union All 
Select Col1, date_time 
From Table2 
Order By date_time 

如果您的查询不包括各种元素,例如TOP或LIMIT需要一个ORDER BY,因此要区分排序的,那么你就可以封装您的查询,派生表:

Select Col, date_time 
From (
     Select Col1 As Col, date_time 
     From Table1 
     Union All 
     Select Col1, date_time 
     From Table2 
     ) As Z 
Order By Z.date_time 
+0

这是我得到的:使用的SELECT语句有不同数量的列,所以我猜表格需要有完全相同数量的列?我现在要去我的夜班,当我回来时,我会发布udpates!感谢托马斯! – KPO 2011-06-17 00:13:48

+0

@KPO - 在联合查询中,每个查询必须返回相同数量的列,并且每个位置中的每列必须是相同(或可隐式转换)的数据类型。 – Thomas 2011-06-17 00:28:13

1

在SQL Server中,您还可以按列号进行排序,例如“ORDER BY 2”在这种情况下,无论您的联合集合中的第二列是什么,都将是排序目标。

+0

技术上,在当前版本和以前版本的SQL Server中是这样,但是微软已经声明他们将在未来版本中停止支持该功能。 – Thomas 2011-06-17 00:05:02

+0

@Thomas Ouch!我一直都在使用它(不是在代码中,而是在ad-hox查询中) – geofftnz 2011-06-17 00:10:06

+0

同意@geofftnz。特别的好捷径。我一直对贬值声明持怀疑态度。我认为他们是试用气球。根据有多少人尖叫,这些事情可能永远持续下去。 – 2011-06-19 12:24:52

0

据我所知,你有X个表格(其中X> 1),每个表格都有它自己的date_time列,并且你想得到最新的更新。如果这是真的,不是可能的方法之一,就是这样做的

SELECT id, date_added FROM table1 
UNION ALL 
SELECT id, date_added FROM table2 
ORDER BY date_added DESC; 

,我心里有其他的方式是,当你取结果,摆阵,并做了“魔法”里面。

+0

@Thomas在我测试我的时候给出了同样的例子:D – RRStoyanov 2011-06-17 00:14:36