Я новичок в SQL и в настоящее время не знаю правильного слова для поиска.
У меня есть первая такая таблица - в ней 5 строк.
SELECT
tFinal2.region, COUNT(newsfeed_id) AS comment
FROM
(SELECT *
FROM
((SELECT *
FROM public.newsfeed_comment) AS T1
INNER JOIN
(SELECT * FROM public.newsfeed) AS T2 ON T1.newsfeed_id = T2.seq) AS tFinal1) AS tFinal2
GROUP BY
tFinal2.region
А это моя вторая таблица:
SELECT tFinal2.region, COUNT(newsfeed_id) AS media
FROM
(SELECT *
FROM
((SELECT *
FROM public.newsfeed_media) AS T1
INNER JOIN
(SELECT * FROM public.newsfeed) AS T2 T1.newsfeed_id = T2.seq) AS tFinal1) AS tFinal2
GROUP BY
tFinal2.region
Во второй таблице 6 строк.
Итак, если я просто соединю 5 строк из таблицы №1 и 6 строк из таблицы №2, используя внутреннее соединение, внешнее соединение и т. Д., Он вернет только 5 строк.
Как я могу присоединиться, чтобы он возвращал все строки и устанавливал значение по умолчанию как ноль для отсутствующих значений? (Я также не могу знать, в какой таблице больше строк. Время от времени она может меняться, и я не могу выполнить левое и правое соединение).
2 ответа
Я думаю, что вы хотите:
select nf.region, coalesce(sum(num_comments), 0) as num_comments,
coalesce(sum(num_media), 0) as num_media
from public.newsfeed nf left join
(select c.newsfeed_id, count(*) as num_comments
from public.newsfeed_comment c
group by c.newsfeed_id
) c
on nf.seq = c.newsfeed_id left join
(select m.newsfeed_id, count(*) as num_media
from public.newsfeed_media m
group by m.newsfeed_id
) m
on nf.seq = m.newsfeed_id
group by nf.region;
Примечания:
- Результаты запроса - это не «таблица», а набор результатов, который можно использовать в качестве подзапроса в другом запросе.
- Используйте псевдонимы таблиц, связанные с именами таблиц. Это упрощает отслеживание запросов.
- Вы хотите агрегировать по двум разным параметрам (медиа и комментарии). Вам нужно агрегировать отдельно, чтобы избежать декартовых произведений).
- Чтобы избежать значений
NULL
, используйтеcoalesce()
. - Не используйте подзапросы
(select * from . . . )
. Их просто сложнее писать и читать. А в некоторых базах данных они могут влиять на производительность.
Используйте функцию left join и coalesce () для замены отсутствующего значения на 0
select tFinal2.region, coalesce(count(newsfeed_id),0) as comment from (
select * from (
(SELECT *
FROM public.newsfeed_comment) as T1
left join
(SELECT * from public.newsfeed) as T2
on T1.newsfeed_id = T2.seq) as tFinal1
) as tFinal2
group by tFinal2.region
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.