SQLite UNION ALL 和 ORDER BY 的正确使用

学习笔记作者:admin日期:2025-06-13点击:13

摘要:分析并修正了一个包含 UNION ALL 和 ORDER BY 的 SQLite 查询,解决子查询中 ORDER BY 和 LIMIT 的作用范围问题。

SQLite UNION ALL 和 ORDER BY 的正确使用

      在 SQLite 中,使用 UNION ALL 时,ORDER BYLIMIT 的作用范围可能引发问题。以下是修正一个具体问题的案例。

原始问题

SELECT '2025-02-23 00:00:00.000' as ID, MARK as lastPackage, MARK as currentPackage 
FROM shijian 
WHERE LEI='APP使用记录' AND ID LIKE '2025-02-23%' 
ORDER BY ID ASC LIMIT 1
UNION ALL
SELECT '2025-02-23 23:59:59.999' as ID, TITLE as lastPackage, TITLE as currentPackage 
FROM shijian 
WHERE LEI='APP使用记录' AND ID LIKE '2025-02-23%' 
ORDER BY ID DESC LIMIT 1
UNION ALL
SELECT ID, MARK as lastPackage, TITLE as currentPackage 
FROM shijian 
WHERE LEI='APP使用记录' AND ID LIKE '2025-02-23%'
ORDER BY ID;

      该语句的问题在于 ORDER BYLIMIT 无法直接应用于子查询中的 UNION ALL

解决方案

(
    SELECT '2025-02-23 00:00:00.000' AS ID, MARK AS lastPackage, MARK AS currentPackage 
    FROM shijian 
    WHERE LEI = 'APP使用记录' AND ID LIKE '2025-02-23%' 
    ORDER BY ID ASC 
    LIMIT 1
)
UNION ALL
(
    SELECT '2025-02-23 23:59:59.999' AS ID, TITLE AS lastPackage, TITLE AS currentPackage 
    FROM shijian 
    WHERE LEI = 'APP使用记录' AND ID LIKE '2025-02-23%' 
    ORDER BY ID DESC 
    LIMIT 1
)
UNION ALL
(
    SELECT ID, MARK AS lastPackage, TITLE AS currentPackage 
    FROM shijian 
    WHERE LEI = 'APP使用记录' AND ID LIKE '2025-02-23%'
)
ORDER BY ID;

      通过将每个子查询用括号包裹,确保 ORDER BYLIMIT 只作用于各自的子查询,最后在整体结果集上添加 ORDER BY ID

注意事项

  • 确保表 shijian 的列名和数据类型与查询一致。
  • 如果 ID 是日期时间类型,需转换为字符串格式。

上一篇      下一篇