为什么以下查询会给出值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
)
答案 0 :(得分:3)
因为在第一个查询中,您对选择中任何行的每次出现都求和1,但对于查询1,您将对选择中每行的“R”值进行求和。
答案 1 :(得分:2)
第一个查询是对内部查询中存在的每条记录求和1。这是因为你用一个常数值求和:SUM(1)
它基本上会返回与COUNT(*)/COUNT(1)
相同的结果。
第二个查询是对R
列的值进行求和 - > 0
和1
等于1。
答案 2 :(得分:2)
SUM(1)
相当于COUNT(*)
:
SELECT COUNT(*) FROM ...
因为它会为1
表的每一行的总计添加FROM
,而不管该行的内容是什么。
第二个查询会关注R
的值,因此会将1
添加到0
,并且到达零。
答案 3 :(得分:2)
执行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>