繁体   English   中英

SELECT SUM(1)FROM(将R选为'0'来选择双UNION ALL将SELECT'1'选为R来选择

[英]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列的值-> 01 ,等于1。

第一个查询中的SUM(1)等于COUNT(*)

SELECT COUNT(*) FROM ...

因为它将FROM表的每一行的总数加1 ,而不管该行的内容如何。

第二个查询注意R的值,因此它将1加到0 ,并到达零。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM