我正在寻找一种将多个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;使用视图或复制子查询。)
这是低效的
最好编写自己的代码(在调用程序中,或作为存储过程),分别执行四个查询并检查结果。