SQL:使用 UNION、ORDER BY 和 LIMIT 进行选择
Posted
技术标签:
【中文标题】SQL:使用 UNION、ORDER BY 和 LIMIT 进行选择【英文标题】:SQL: SELECT with UNION, ORDER BY and LIMIT 【发布时间】:2011-01-14 23:15:57 【问题描述】:我收到 ORDER by 应该出现在 UNION 之后的错误,但我希望这些查询在合并为一个之前排序,然后限制为 10 个。
SELECT *
FROM (SELECT time, x, y, z
FROM db
WHERE time >= now
ORDER by time, x
UNION
SELECT time, x, y, z
FROM db
WHERE time < now
ORDER by time, x)
LIMIT 10
我希望你能理解我想要做什么并且可以帮助我;-)
【问题讨论】:
适用于 SQLITE:android.database.sqlite.SQLiteException: ORDER BY 子句应该在 UNION 之后而不是之前: 【参考方案1】:如果您在 SQLite 中有一个非常复杂的查询,但需要使用 UNION 进行排序,那么您可以尝试
选择 * 从 ( select * from b ORDER BY date asc ) 联盟 选择 * 从 ( select * from b ORDER BY name desc ) 联盟 选择 * 从 ( select * from b ORDER BY gender asc )【讨论】:
这正是我想要的!我试图弄清楚除了括号之外我还需要什么。【参考方案2】:订单将影响整个工会。
无论如何,您似乎想要最接近now
的行。你可以试试这个:
SELECT time, x, y, z
FROM db
ORDER BY ABS(time - now) ASC
LIMIT 10
【讨论】:
【参考方案3】:在“标准”中(对于“标准”的一些定义)SQL;
select top 10 *
from ( select time,x,y,z from db where time > now
union select time,x,y,z from db where time < now
) t
order by t.time
如何限制结果集中的行数可能因 SQL 实现而异。
【讨论】:
【参考方案4】:它不是这样工作的,至少在 mysql 中(你没有指定)。 ORDER 操作是在选择数据并且所有 UNION、GROUP BY 等都已执行之后进行的。
请参阅SQL Server: ORDER BY in subquery with UNION 了解解决方法。
【讨论】:
【参考方案5】:我应用的任何简单解决方案如下:
SELECT
name,
TO_DATE(date1, 'DD-MON-YYYY HH:MI AM')
FROM TableX
UNION
SELECT
name,
TO_DATE(date2, 'DD-MON-YYYY HH:MI AM')
FROM TableY
ORDER BY 2 DESC;
这将按第二(日期)列对结果进行排序。
如果日期列是字符串,可以应用上图的TO_DATE函数,否则不需要。
【讨论】:
以上是关于SQL:使用 UNION、ORDER BY 和 LIMIT 进行选择的主要内容,如果未能解决你的问题,请参考以下文章
在 sql 查询中使用 group/order by 和 union 子句
SQL:在 UNION 查询中使用 Top 1 和 Order By
各位大神,怎么在sql语句union中使用order by?
ORACLE 两个order by的SQL使用 UNION 或者 UNION ALL 报错 ORA-00933:sql命令未正确结束