如何从两个含datetime字段的表中查询最新5条数据并使用别名?
如何从两个含datetime字段的表中获取按时间排序的最后5条记录?
首先得指出你原来的SQL语句存在几个关键问题:
- 直接写
Table1, Table2会生成笛卡尔积,也就是两个表的所有行两两组合,这完全不是你想要的合并时间记录的效果 - 同时使用
TOP 5和LIMIT 5是错误的,这俩是不同数据库的语法,二选一即可 ORDER BY dt里的dt字段不明确,因为两个表都有这个字段,数据库会报错或者无法正确排序
正确的解法思路
我们需要先把两个表的dt字段数据合并到一起,再按时间倒序排序,最后取前5条。这里用UNION ALL来合并(如果需要去重就用UNION,但你给的示例数据里有重复时间,应该是要保留所有记录的)。
示例SQL语句
根据不同数据库,语法略有区别:
MySQL/PostgreSQL 版本
SELECT dt FROM ( -- 合并两个表的datetime字段 SELECT dt FROM Table1 UNION ALL SELECT dt FROM Table2 ) AS combined_dates -- 按时间倒序,最新的在前 ORDER BY dt DESC -- 取前5条 LIMIT 5;
SQL Server 版本
SELECT TOP 5 dt FROM ( SELECT dt FROM Table1 UNION ALL SELECT dt FROM Table2 ) AS combined_dates ORDER BY dt DESC;
Oracle 版本
SELECT dt FROM ( SELECT dt FROM Table1 UNION ALL SELECT dt FROM Table2 ORDER BY dt DESC ) FETCH FIRST 5 ROWS ONLY;
针对你提供的数据的执行结果
把你给出的两个表的dt数据合并后,按倒序排序的前5条是:
- 2018-04-29 15:09:23(来自Table1)
- 2018-04-29 15:09:23(来自Table2)
- 2018-04-29 13:09:23(来自Table1)
- 2018-04-29 13:09:23(来自Table2)
- 2018-04-21 13:09:23(来自Table1)
如果用UNION代替UNION ALL,重复的时间会被去重,结果会变成:
- 2018-04-29 15:09:23
- 2018-04-29 13:09:23
- 2018-04-21 13:09:23
- 2018-04-19 13:09:23
- 2018-04-18 13:09:23
你可以根据需求选择用UNION ALL还是UNION。
内容的提问来源于stack exchange,提问作者Vurtiec
相关产品推荐
相关产品推荐

