Запросить все столбцы таблицы1 левого соединения и счет таблицы2 - PullRequest
0 голосов
/ 01 декабря 2018

Я не смог заставить этот запрос работать:

НЕ РАБОТАЕТ

select 
    Region.*, count(secteur.*) count 
from  
    Region 
left join 
    secteur on secteur.region_id = Region.id

Решение, которое я нашел, состоит в следующем, но есть ли лучшее решение, использующееили если это не влияет на производительность, потому что у меня есть очень большой набор данных около 500K строк

РАБОТАЕТ, НО ИЗБЕЖАЕТ ПРОБЛЕМ ВЫПОЛНЕНИЯ

select 
    Region.*,
    (select count(*) 
     from Secteur 
     where Secteur.Region_id = region.id) count 
from  
    Region 

Ответы [ 4 ]

0 голосов
/ 01 декабря 2018

Я бы пошел с этим запросом:

select r.*,
       (select count(*) 
        from Secteur s
        where s.Region_id = r.id
      ) as num_secteurs 
from Region r;

Затем исправьте проблему производительности, добавив индекс на Secteur(region_id):

create index idx_secteur_region on secteur(region_id);
0 голосов
/ 01 декабря 2018

Я бы предложил:

select region.*, count(secteur.region_id) as count
from region left join secteur on region.id = secteur.region_id
group by region.id, region.field2, region.field3....

Обратите внимание, что count(table.field) будет игнорировать нули, тогда как count(*) будет включать их.


В качестве альтернативы,оставьте присоединение к подзапросу и используйте coalesce, чтобы избежать нулей:

select region.*, coalesce(t.c, 0) as count
from region left join 
(select region_id, count(*) as c from secteur group by region_id) t on region.id = t.region_id
0 голосов
/ 01 декабря 2018

Вы делаете две ошибки

  • Первое: вы пытаетесь вычислить COUNT () только в одной (я имею в виду, во второй) таблице.Это не сработает, потому что COUNT (), как и любая агрегатная функция, вычисляет только для всего набора строк , а не только для любой части набора (не только для одной или другой).за столом).В первом запросе вы можете заменить secteur. * только звездочкой, например Region.region_id, count(*) AS count, и не забудьте добавить Region.region_id на шаге GROUP BY.
  • Second:Вы должны определить не только статистическую функцию в запросе, но и другие поля: select Region.*, но вы не определяете их на шаге GROUP BY.Вам нужно добавить в оператор GROUP BY все столбцы, которые вы определили на шаге SELECT, но не применять к ним агрегатные функции.
  • Append: not, GROUP BY Region.* не будет работать,Вы должны определить столбцы в шаге GROUP BY по их фактическим именам.

Таким образом, правильная форма этого будет выглядеть как

SELECT 
    Region.col1
    ,Region.col2,
    , count(*) count 
from  Region 
left join 
    secteur on secteur.region_id = Region.id
GROUP BY Region.col1, Region.col2

Или, если вы нене хотите вводить каждое имя столбца, используйте окно запросов

SELECT
    Region.*,
    , count( * ) OVER (PARTITION BY region_id) AS count 
from  Region 
left join 
    secteur on secteur.region_id = Region.id
0 голосов
/ 01 декабря 2018

Я бы присоединился к region по совокупному запросу secteur:

SELECT    r.*, COALESCE(s.cnt, 0)
FROM      region r
LEFT JOIN (SELECT   region_id, COUNT(*) AS cnt
           FROM     secteur
           GROUP BY region_id) s ON s.region_id = r.id
...