从第一个 table 中排除值的联合

Union which excludes values from the first table

我试图解决的原始问题是我需要显示特定 "joined" table 中的所有行。然而,这些有时是空白的,没有总数,通常不会显示(想想每个类别和计数)。

所以我想做的是合并到一个“0 值”数据集以显示所有类别。但是,当我执行合并时,它显示一个 0 值行,以及正常数据。这是一个例子..

SELECT category_name, COUNT(files_number)
FROM files
LEFT JOIN categories ON categories.category_id = files.category_id

UNION 

SELECT category_name, 0
FROM categories

这将给我一个类似于此的结果集:

category_name | value
----------------------
open file     | 0
open file     | 23
closed file   | 0

有什么方法可以删除重复的零值条目吗?请不要在实际查询中也有复杂的 WHERE 子句,因此最好避免重复。

我不明白你为什么要进行左连接和联合..

您可以执行以下操作以删除重复项、包装您的查询并按

进行分组
;with cte
as
(
SELECT category_name, COUNT(files_number)
FROM files
LEFT JOIN categories ON categories.category_id = files.category_id
UNION 
SELECT category_name, 0
FROM categories
)
select categoryname,sum(aggcol)
from cte
group by 
category

一种方法是 select 类别 table 中的所有类别,然后 LEFT JOIN 到文件计数(按 category_id 分组)。

SELECT c.category_name, ISNULL(fc.FileCount, 0) AS FileCount
FROM categories c
    LEFT JOIN (
        SELECT category_id, COUNT(files_number) AS FileCount
        FROM files
        GROUP BY category_id
    ) fc ON c.category_id = fc.category_id

编辑 如果你想反转查询,你可以这样做,使用 RIGHT OUTER JOIN - 因此返回类别 table 中的每个类别,无论是否有任何文件:

SELECT c.category_name, COUNT(f.category_id) AS FileCount
FROM files f
    RIGHT JOIN categories c ON c.category_id = f.category_id
GROUP BY c.name