sql - 如果没有行匹配,这个计数怎么会返回 0?

标签 sql sql-server t-sql

如果没有匹配,我需要以下查询返回 0:

CREATE TABLE #Operations (
    Discriminator varchar(40)
);

INSERT INTO #Operations
VALUES
    ('HistoricoCarga'),
    ('HistoricoDescarga')
;

SELECT
    o.Discriminator,
    CASE 
        WHEN COUNT(*) IS NULL THEN 0
        ELSE COUNT(*)
    END AS Total
FROM 
    HistoricosOperacion ho
        RIGHT JOIN #Operations o
            ON ho.Discriminator = o.Discriminator
WHERE
    ho.FechaEnvioIntegracionUTC IS NULL
    AND DATEDIFF(MINUTE, ho.FechaUTC, GETUTCDATE()) > 10
GROUP BY o.Discriminator;

我尝试将 count(*) 更改为 count(ho.Discriminator) 或将临时表更改为:


CREATE TABLE #Operations (
    Discriminator varchar(40),
    dummy int
);

INSERT INTO #Operations
VALUES
    ('HistoricoCarga', 0),
    ...

我需要输出如下:

HistoricoCarga         0
HistoricoDescarga      0

最佳答案

不要 COUNT(*),从连接的稀疏侧开始计算连接列

CREATE TABLE #Operations (
    Discriminator varchar(40)
);

INSERT INTO #Operations
VALUES
    ('HistoricoCarga'),
    ('HistoricoDescarga')
;

SELECT
    o.Discriminator,
    COUNT(ho.Discriminator) AS Total
FROM 
    
    #Operations o
    LEFT JOIN
    HistoricosOperacion ho
    ON ho.Discriminator = o.Discriminator AND DATEDIFF(MINUTE, ho.FechaUTC, GETUTCDATE()) > 10

GROUP BY o.Discriminator;

将限制从 WHERE 移至 ON 意味着只有同时满足这两个条件的行才会加入。您还可以考虑:

#Operations o
LEFT JOIN
(SELECT * FROM HistoricosOperacion WHERE DATEDIFF(MINUTE, ho.FechaUTC, GETUTCDATE()) > 10) ho
ON ho.Discriminator = o.Discriminator 

如果你觉得更有意义

关于sql - 如果没有行匹配,这个计数怎么会返回 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67769787/

相关文章:

sql - 在没有持久数据库连接的情况下填充 RowSource 和 RecordSource

SQL 层次结构 - 解析给定节点的所有祖先的完整路径

mysql - #1146 - 表 'phpmyadmin.pma_column_info' 不存在

sql - 带参数的 Case 表达式失败

sql-server - 从 SQL Server 中的 XML 列中提取所有属性值

mysql - 加入不要覆盖结果 mysql

mysql - 如何从 MySQL 中检索 JSON 数据?

mysql - SQL 帮助 : How come the total from this query is different that a summation query?

sql-server - 查找 IN 表达式中不存在记录的 id

sql - 使用 SQL Server 生成随 secret 钥