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?

UNION ALL、UNION与ORDER BY

ORACLE 两个order by的SQL使用 UNION 或者 UNION ALL 报错 ORA-00933:sql命令未正确结束

sql server 查询 order by 与 union 并替换多个列的空值