UNION短路? (如果第一个子句没有结果,则只执行第二个子句)

时间:2013-09-03 22:22:54

标签: mysql sql set union resultset

如果我这样做:

SELECT * FROM A   
WHERE conditions  
UNION  
SELECT * FROM B   
WHERE conditions 

我得到了B的查询的A 结果集的查询结果集的并集。

是否有方法/操作符,以便我可以获得短路OR结果?

即。获取SELECT * FROM A WHERE conditions的结果如果返回任何内容,则获取SELECT * FROM B WHERE conditions的结果集?

3 个答案:

答案 0 :(得分:3)

简短的回答是否定的,但您可以避免第二个查询,但必须重新运行第一个查询:

SELECT * FROM A   
WHERE conditions  
UNION  
SELECT * FROM B   
WHERE NOT EXISTS (
    SELECT * FROM A   
    WHERE conditions)
AND conditions

这假设优化器帮助输出和短路第二个查询,因为NOT EXISTS的结果对所有行都是假的。

如果第一个查询比第二个查询便宜得多,那么如果第一行返回行,则可能会获得性能。

答案 1 :(得分:1)

您可以使用单个SQL查询执行此操作:

SELECT *
FROM A   
WHERE conditions  
UNION ALL
SELECT *
FROM B   
WHERE conditions and not exists (select * from A where conditions);

答案 2 :(得分:0)

您是否尝试过“If”声明?

If(select Count(*) from A where conditions) > 0 
Then Select * from A where conditions
Else Select * from B where conditions