mysql - 回退迭代 SQL 查询

标签 mysql sqlite

我正在寻找一种将多个 SQL 查询结果与此行为组合起来的模式:

'尝试查询A,如果结果不为空则返回'

'如果A没有返回尝试查询B,如果结果不为空则返回'

'如果B没有返回任何内容尝试查询C,如果结果不为空则返回它们'

'如果C没有返回尝试查询D,如果结果不为空则返回它们'

'如果A、B、C、D都返回空集,则返回空集'

有什么建议吗?我的目标是简单性和性能,虽然我希望获得相对通用的 SQL,但我专门在 sqlite 和 mysql 上运行。

TIA。

最佳答案

在一般情况下,您必须单独检查查询是否返回任何内容:

WITH A AS (SELECT ...),
     B AS (SELECT ...),
     C AS (SELECT ...),
     D AS (SELECT ...)
SELECT * FROM A
UNION ALL
SELECT * FROM B WHERE NOT EXISTS (SELECT * FROM A)
UNION ALL
SELECT * FROM C WHERE NOT EXISTS (SELECT * FROM A)
                  AND NOT EXISTS (SELECT * FROM B)
UNION ALL
SELECT * FROM D WHERE NOT EXISTS (SELECT * FROM A)
                  AND NOT EXISTS (SELECT * FROM B)
                  AND NOT EXISTS (SELECT * FROM C);

(MySQL 不支持WITH;使用 View ,或复制子查询。)

这效率很低。
最好编写自己的代码(在调用程序中或作为存储过程)来分别执行四个查询并检查结果。

关于mysql - 回退迭代 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33966882/

相关文章:

sql - SQLite中Where子句中有多个条件时如何使用 "Or"语句?

mysql - yugabyte db 中可能的最大事件节点数是多少?

php - 使用 mysql 优化嵌套 if 语句

mysql - 数据库性能: how do more columns in a table impact design/development/performance

MySQL AVG 函数给出的小数比预期多

java - hibernate 错误 "database is locked"。我如何正确关闭 session ?

python - 收到错误 AttributeError : '_tkinter.tkapp' object has no attribute 'getitems'

sqlite - SQLite 中 INSERT、UPDATE 和 SELECT 的时间复杂度是多少?

php - Laravel - 定义多表关系

iphone - 使用数据库时在后台任务中更新 SQLite DB 的最佳策略