[英]SELECT SUM(1) FROM ( SELECT '0' as R FROM dual UNION ALL SELECT '1' as R FROM dual )
为什么以下查询给出值2
而不是我的期望1
?
SELECT SUM(1) FROM (
SELECT '0' as R FROM dual
UNION
SELECT '1' as R FROM dual
)
但是这个查询满足期望吗?
SELECT SUM(R) FROM (
SELECT '0' as R FROM dual
UNION
SELECT '1' as R FROM dual
)
因为在第一个查询中,您对选择项中任何行的每次出现求和都为1,但对于查询1则要对选择项中的每一行求和“ R”的值。
当您执行SELECT 1
您将提取的是硬编码值1,而不是您可能期望的那样提取的第一列。 您的查询是
SQL> SELECT 1
2 FROM (SELECT '0' AS R FROM DUAL
3 UNION
4 SELECT '1' AS R FROM DUAL
5 );
1
----------
1
1
两行包含1; 这些行的SUM
为2:
SQL> SELECT SUM(1)
2 FROM (SELECT '0' AS R FROM DUAL
3 UNION
4 SELECT '1' AS R FROM DUAL
5 );
SUM(1)
----------
2
例如,您可以尝试
SQL> select 100
2 from ( select 1 from dual);
100
----------
100
这说明select 100
不会在内部查询中查找第100列,而只是给出值100。
在下面的查询中,您正在提取R
的变量值(我将字符串编辑为数字); 在您的查询中,您具有两行,如下所示,其中R
为连续0且另一行为1:
SQL> SELECT R
2 FROM (SELECT 0 AS R FROM DUAL
3 UNION
4 SELECT 1 AS R FROM DUAL
5 );
R
----------
0
1
这两个值的总和为0 + 1 = 1
:
SQL> SELECT SUM(R)
2 FROM (SELECT 0 AS R FROM DUAL
3 UNION
4 SELECT 1 AS R FROM DUAL
5 );
SUM(R)
----------
1
SQL>
对于内部查询中存在的每个记录,第一个查询的总和为1。 这是因为您求和了一个常数: SUM(1)
,该值基本上将返回与COUNT(*)/COUNT(1)
相同的结果。
第二个查询是求和R
列的值-> 0
和1
,等于1。
第一个查询中的SUM(1)
等于COUNT(*)
:
SELECT COUNT(*) FROM ...
因为它将FROM
表的每一行的总数加1
,而不管该行的内容如何。
第二个查询注意R
的值,因此它将1
加到0
,并到达零。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.