有WHERE子句的COUNT比没有WHERE子句的行多

Roo*_*123 6 sql

这可能不是一个合适的论坛,但我想了解查询中发生的逻辑错误。

我在下面的查询中写道,以了解有多少用户传递的邮件大于发送的邮件(可能是数据捕获中的错误,只是想对其进行评估)。

SELECT COUNT(DISTINCT user_id)
FROM wk_24_trigger

UNION

SELECT COUNT(DISTINCT user_id)

FROM (

SELECT *, (CASE WHEN delivered > 0 THEN 1 ELSE 0 END) as D,
(CASE WHEN sent > 0 THEN 1 ELSE 0 END) as S
FROM wk_24_trigger) t
WHERE t.D > t.s
Run Code Online (Sandbox Code Playgroud)

我得到的结果如下

    _c0
1   1056840
2   1819729
Run Code Online (Sandbox Code Playgroud)

我不明白为什么第2行>第1行。

理想情况下,即使对于已发送的每个条目>发送,第2行和第1行也应该相同

Cha*_*tha 2

您确定第一行是第一个查询的结果,第二行是第二个查询的结果..?

总是不需要..

尝试在每个查询的计数后添加别名并验证结果。

你也可以检查下面的例子..

WITH TEMP
AS(
SELECT 'A' USER_ID , 1 DELIVERED  , NULL SENT  FROM DUAL
UNION 
SELECT 'B' ID , 10 A , 1 B FROM DUAL
UNION 
SELECT 'C' ID , NULL A , 1 B FROM DUAL
UNION 
SELECT 'D' ID , -1 A , 1 B FROM DUAL
) 
SELECT COUNT(DISTINCT USER_ID), 'QUERY_1' QUERY
FROM TEMP
UNION
(SELECT COUNT(DISTINCT USER_ID), 'QUERY_2'

  FROM (        
        SELECT USER_ID,DELIVERED,SENT,
                (CASE
                  WHEN DELIVERED > 0 THEN
                   1
                  ELSE
                   0
                END)  D,
                (CASE
                  WHEN SENT > 0 THEN
                   1
                  ELSE
                   0
                END)  S
          FROM TEMP) T
 WHERE T.D > T.S);
Run Code Online (Sandbox Code Playgroud)

系统输出如下..

    COUNT(DISTINCTUSER_ID)  QUERY
1                       1   QUERY_2
2                       4   QUERY_1
Run Code Online (Sandbox Code Playgroud)

同样的情况也可能是你的情况..

  • 是的,但大多数时候,系统会根据 ascii 值对结果进行排序并显示输出。 (2认同)