为什么UNION ALL有和没有括号表现不同?

时间:2012-04-18 08:26:24

标签: mysql select parentheses union-all

我有两种方式实现此查询:

SELECT race1, mode1
FROM organization 
WHERE condition = 1 LIMIT 1

UNION ALL

(SELECT race2, mode2
FROM   organization 
WHERE  condition = 1 LIMIT 1)

UNION ALL

(SELECT race, mode FROM  organization_new
WHERE PK_Id = 1)

并且

SELECT race1, mode1
FROM organization 
WHERE condition = 1 LIMIT 1

UNION ALL

SELECT race2, mode2
FROM   organization 
WHERE  condition = 1 LIMIT 1

UNION ALL

SELECT race, mode FROM  organization_new
WHERE PK_Id = 1

如您所见,区别仅在于第一个查询中的括号。 在第一个查询中,我按预期获得结果(获取所有三个选择中的所有值,无需解释)。但是当我继续使用第二个查询时,我会根据需要获得结果但不是预期的结果,这只是第一个选择符合WHERE子句的值。也就是说,如果有race1, mode1 condition = 1,那么我只得到那个结果。如果没有,那么我race2, mode2 condition = 1。如果第二个select语句都是空的,那么我根据第三个select语句获取值。如果没有提供括号,为什么UNION ALL表现得像OR

编辑:我使用的是MySQL 5.0.51a

1 个答案:

答案 0 :(得分:2)

那是因为你正在使用LIMIT。

MySql参考说如果你想在个别选择上使用ORDER BY或LIMIT,那么你必须用括号括起你的选择。

示例(来自MySQL参考):

要将ORDER BY或LIMIT应用于单个SELECT,请将该子句放在括起SELECT的括号内:

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

资源可以在这里找到: http://dev.mysql.com/doc/refman/5.0/en/union.html

编辑:更改了参考链接,因为之前的版本是针对5.5版的。但答案并没有改变。