联盟和工会都在oracle数据库中

时间:2018-03-13 13:34:10

标签: sql oracle union

在执行以下两个查询时(关注两个星号之间的部分* ____ *),我真的想知道UNION ALL的位置如何改变输出。我无法理解。

查询1

SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL 
*UNION All SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL*
UNION SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL

查询结果

NAME    MARKS
Jack    100

查询2

SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL 
UNION SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL 
*UNION ALL SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL*

查询结果

NAME    MARKS
Jack    100
Jack    100

谢谢:)

4 个答案:

答案 0 :(得分:3)

如果您没有指定parantheses,select将一个接一个地执行。所有集合运算符minusunionunion allintersect具有相同的优先级。

Oracle Documentation

在第一个查询中,UNION在最后执行,因此每个查询不会有重复行。在第二步中,UNION ALL在最后执行,因此每个查询都会有重复行。

答案 1 :(得分:1)

union和union都具有与操作相同的优先级。所以在没有括号的情况下,你的两个工会将从上到下进行评估。您的第一个查询正在按如下方式进行评估:

double

同样的推理适用于您的第二个查询。

答案 2 :(得分:1)

Union和Union all之间的区别在于Union all不会消除重复的行,

第一个查询输出:

第1步:

SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL 
UNION All SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL

结果为2行,因为union all允许重复。

第2步:

UNION SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL

此查询将仅选择上述2行及其自身中没有重复的行。 返回1行。

在第二个查询...

第1步

SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL 
UNION SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL 

返回1行,因为union只选择不同的行。

第2步

UNION ALL SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL

返回2行,因为它允许重复。

答案 3 :(得分:0)

要了解此行为,您需要清楚UNION和UNION ALL之间的区别。

查询1:前两行的输出将返回2行。但是,使用'UNION'运算符的最后一行(sql语句)将删除重复的行,包括它自己的输出。因此,第一个查询总数将仅返回1行。

查询2:现在,UNION在第二行。与第一行合并后,它将仅返回第一行。但是,在带有“ UNION ALL”的第三行,它将返回2行。因为,“ UNION ALL”不会删除重复项。

相关问题