SELECT SUM(1)FROM(选择'0'作为R FROM双UNION ALL SELECT'1'作为R FROM dual)

时间:2016-12-20 11:56:54

标签: mysql sql oracle

为什么以下查询会给出值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
)

4 个答案:

答案 0 :(得分:3)

因为在第一个查询中,您对选择中任何行的每次出现都求和1,但对于查询1,您将对选择中每行的“R”值进行求和。

答案 1 :(得分:2)

第一个查询是对内部查询中存在的每条记录求和1。这是因为你用一个常数值求和:SUM(1)它基本上会返回与COUNT(*)/COUNT(1)相同的结果。

第二个查询是对R列的值进行求和 - > 01等于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>