回退迭代sql查询

时间:2015-11-28 01:58:30

标签: mysql sqlite

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

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

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

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

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

'如果A,B,C,D全部返回空集,则返回空集'

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

TIA。

1 个答案:

答案 0 :(得分:1)

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

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;使用视图或复制子查询。)

效率低下 编写自己的代码(在调用程序中,或作为存储过程)分别执行四个查询并检查结果将是一个更好的主意。