使用WHERE子句的COUNT行比不使用WHERE子句的行多

时间:2019-06-19 17:10:57

标签: 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

我得到的结果如下

    _c0
1   1056840
2   1819729

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

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

1 个答案:

答案 0 :(得分:2)

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

它不一定是..

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

您也可以查看下面的示例。

 Code:1 var _bind =from a in Orders:
                            select new OrderItem()
                            {
                                ItemName = a.ItemName,
                                Amount = a.Amount,
                                Comment = a.Comment,
                                Status = a.Status,
                                TableNumber = a.TableNumber,
                                ordertime = a.ordertime,
                                Id = a.Id,
                            };
                dgviewOrders.DataSource = _bind.ToList();

code 2:   OrderItem currentObject = (OrderItem)row.DataBoundItem;
Code 3 :var _bind =from a in Orders:
                            select new()
                            {
                                ItemName = a.ItemName,
                                Amount = a.Amount,
                                Comment = a.Comment,
                                Status = a.Status,
                                TableNumber = a.TableNumber,
                                ordertime = a.ordertime,
                                Id = a.Id,
                            };

和系统输出如下。

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);

您的情况也是如此。