2016-12-20 96 views
1

为什么下面的查询给出的值是2而不是我期望的1SELECT SUM(1)FROM(SELECT t'0'as R FROM dual UNION ALL SELECT'1'as R FROM dual)

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

的Oracle或MySQL ? – Aleksej

+2

请使用有意义的标题 – HoneyBadger

+2

如果第二个查询满足您的期望,那么Oracle教会您有错误的期望。你应该预期第二个查询抛出一个错误,因为你正在添加字符串。不幸的是,甲骨文有一种“阅读你的思想”的坏习惯,并将字符串转换为数字,没有任何警告。它会很好地帮助你消除这种习惯。 – mathguy

回答

2

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

第二查询的值求和R列 - >01其等于1。

3

因为你任何行的每次出现时在选择求和1中的第一查询中,但对于查询1,您正在对选择中每行的'R'值进行求和。

2

在第一个查询SUM(1)相当于COUNT(*)

SELECT COUNT(*) FROM ... 

因为它增加了1总为FROM表的每一行,而不管该行的内容。

第二个查询关注R的值,所以它将1添加到0,并且到达零。

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在另一个行和1 0:

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> 
相关问题