Объедините два SQL-запроса, которые имеют разный размер, потому что где

0

У меня есть два запроса SQL.

В одном я ищу, сколько городов в каждой стране, и отфильтрую все города с менее чем 6 городами.

Во втором я ищу, сколько населения в столице, и отфильтровываю всех, в которых проживает менее 500 000 жителей.

Результат, который я ищу, - это поиск по всем странам с более чем 6 городами в базе данных и менее чем 500 000 жителей, потому что они разных размеров, и я не могу их объединить

select c.name, count(ci.name) as states_in_country
from country c, city ci
where c.code=ci.country 
group by c.name
having count(ci.name)>5 
;

select c.name, c.capital, ci.population
from country c, city ci
where c.capital=ci.name and ci.population>500000
;

Я хотел сделать это в одном и том же

select c.name, count(ci.name) as states_in_country, ci.population
from country c, city ci
where c.code=ci.country and c.capital=ci.name
group by c.name
having count(ci.name)>5 
;

Но это показывает счетчик для городов как один. столица.

Спасибо

  • 0
    Не могли бы вы показать схему таблиц страны и города и примеры данных?
  • 0
    Я немного запутался в том, что твоя цель. Если вы отфильтруете по количеству жителей в столице, как в запросе будет показан какой-либо другой город (если, конечно, это не другие столицы), уточните, пожалуйста?
Показать ещё 7 комментариев
Теги:
database

4 ответа

0

Вот запрос, который может работать. Обратите внимание на тот факт, что вы упоминаете, что численность населения меньше, и вы используете в своем запросе > 500000 что больше, чем. Поэтому убедитесь, что вам нужно меньше.

select c.name, 
       cyCapital.name as capital,
       cyCapital.population as capPop,
       count(cy.*) cities
  from country c
         inner join city cy
           on c.code = cy.country
            and cy.population < 500000
         left join city cyCapital
           on c.code = cyCapital.country
           and c.capital = cyCapital.name
group by c.name,
         cyCapital.name as capital,
         cyCapital.population as capPop
having count(cy.*) > 5
0

Похоже, что вы ищите не в запросе, который вы пытались

select c.name 
from country 
where c.name NOT IN (
  select c.name
  from country c
  INNER JOIN city ci ON c.code=ci.country 
  group by c.name
  having count(ci.name)>5 
  ;

)  
and NOT IN (
  select c.name
  from country c
  INNER JOIN city ci ON c.capital=ci.name and ci.population>500000
)
0

Страны с более чем шестью городами и населением менее 500 000 человек:

select country
from city
group by country
having count(*) > 6 and sum(population) < 500000;

Страны с более чем шестью городами и хотя бы одним из них с населением менее 500 000 человек:

select country
from city
group by country
having count(*) > 6 
  and count(case when population < 500000 then 1 end) > 0;

Страны с более чем шестью городами, и все они с населением менее 500 000 человек:

select country
from city
group by country
having count(*) > 6 
  and count(case when population >= 500000 then 1 end) = 0;

Страны с более чем шестью городами и столицей с населением менее 500 000 человек:

select c.code
from country c on ci.country = c.code
join city ci
group by c.code
having count(*) > 6 
  and count(case when c.capital = ci.name and ci.population < 500000 then 1 end) = 1;

Ну, вы поняли...

0

Объединение должно сделать работу:

SELECT
    c.name,
    count(ci.name AS cities_in_country),
    c.capital,
    ci.population
FROM country
LEFT JOIN city ON c.code = ci.country
WHERE ci.population > 500000
HAVING COUNT(ci.name) > 5;
  • 0
    Вы - внешнее присоединение, потому что вас также интересуют страны, в которых нет городов? Но из этих нулевых городов более пяти должны иметь более 50000 жителей? Не присоединяйся, когда не нужно. И когда это необходимо, убедитесь, что критерии объединения включены в предложение ON , а не в WHERE . (Ваше WHERE делает ваше внешнее объединение простым внутренним соединением, потому что записи с внешним соединением имеют нулевое заполнение.)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню