SQL JOIN возвращает больше записей, чем ожидалось - PullRequest
0 голосов
/ 09 января 2019

У меня есть таблица:

Country city population
------------------------
Israel  RG  100
Israel  TA  300
US  NY  900
US  SF  700

Чтобы получить максимальную численность населения для каждой страны, я запускаю следующий запрос:

select Country, max(population) as maxPopulation 
from A 
group by Country

Я хочу получить полный вывод:

Country city population
-----------------------
Israel  TA  300
US  NY  900

Для этого мне нужно присоединиться к полному столу - поправьте меня, если я ошибаюсь.

select A.Country, A.city, A.population 
from A 
right join
     (select Country,  max(population) as maxPopulation 
      from A 
      group by Country) temp on temp.Country = A.Country

Возвращает все 4 записи ... вместо 2 ...

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Я бы использовал стандартный CTE:

with
x as (
  select country, max(population) as pop from A group by country
)
select A.*
from A
join x on x.country = A.country and x.pop = A.population

[желательно?] Побочный эффект этого запроса заключается в том, что если будет несколько городов с одинаковым максимальным населением, он покажет их все.

0 голосов
/ 09 января 2019

Вы можете использовать коррелированный подзапрос :

select a.*
from a 
where population = (select max(a1.population) from a a1 where a1.Country = a.Country);

Для вашей JOIN версии запроса вам нужно еще одно условие, . . . and temp.maxPopulation = A.Population и почему вам нужно только правое объединение здесь inner join достаточно:

select a.*
from a inner join
       (select Country,  max(population) as maxPopulation 
        from a 
        group by Country
       ) temp 
       on temp.Country = a.Country and temp.maxPopulation = a.population; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...