2016-08-18 3 views
0

Исходная проблема, которую я пытаюсь решить, заключается в том, что мне нужно показать все строки из определенной «объединенной» таблицы. Однако иногда они пустые без итогов и обычно не показывают (думают категории и подсчеты для каждого).Союз, который исключает значения из первой таблицы

Так что я пытаюсь сделать это объединение к набору данных «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 в реальном запросе, поэтому предпочтительнее избегать дублирования.

+0

Я забыл об этом в исходном вопросе, но есть некоторые ограничения, с которыми я сталкиваюсь, потому что это реализовано с использованием BIRT. Таким образом, «правильный» ответ для меня может отражать эти ограничения, установленные BIRT. – Sh4d0wsPlyr

ответ

1

Я не понимаю, почему вы делаете налево присоединиться и объединение ..

можно сделать ниже, чтобы удалить дубликаты, обернуть запрос и сделать группу по

;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 
+0

Мне пришлось внести небольшое изменение в это (так как мой инструмент - BIRT - не позволяет мне делать все на SQL-сервере. Однако, похоже, он работает и спас меня от необходимости изменять любой запрос. больше, но это может работать (более или менее). – Sh4d0wsPlyr

1

Один способ заключается в выборе все категории из таблицы категорий и LEFT JOIN на количество файлов (сгруппировано по категории_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 - поэтому каждая категория из категорий таблицы возвращается, независимо от того, есть ли какие-либо файлы для это:

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 
+0

Я не уверен, имеет ли значение для вашего примера, но запрос (который я бы предпочел не переписывать, поскольку он большой и сложный) менялся на противоположный - например, выбрать файлы , присоединяйте категории. У меня также есть несколько sum/avg/count, выполняющихся по этому запросу. Как вы думаете, он по-прежнему будет работать с предлагаемым исправлением? – Sh4d0wsPlyr

Смежные вопросы