Я новичок в 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

enter image description here

А это моя вторая таблица:

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

enter image description here

Во второй таблице 6 строк.

Итак, если я просто соединю 5 строк из таблицы №1 и 6 строк из таблицы №2, используя внутреннее соединение, внешнее соединение и т. Д., Он вернет только 5 строк.

Как я могу присоединиться, чтобы он возвращал все строки и устанавливал значение по умолчанию как ноль для отсутствующих значений? (Я также не могу знать, в какой таблице больше строк. Время от времени она может меняться, и я не могу выполнить левое и правое соединение).

sql
1
Khant Thu Linn 23 Окт 2018 в 10:55

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 . . . ). Их просто сложнее писать и читать. А в некоторых базах данных они могут влиять на производительность.
1
Gordon Linoff 24 Окт 2018 в 23:57

Используйте функцию 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
0
Fahmi 23 Окт 2018 в 07:59
52943884