sql подзапросы - PullRequest
       98

sql подзапросы

4 голосов
/ 17 июня 2011

Может ли кто-нибудь помочь мне со следующим:

В некоторых странах население более чем в три раза превышает население любого из их соседей (в том же регионе).Укажите страны и регионы.

моя попытка:

select x.name, x.region
from bbc x
where x.population >all
(select population*3
from bbc y
where y.region = x.region)

синтаксис правильный, но записи не возвращаются (должно возвращаться 3 строки)

Найдите каждую страну, которая относится к региону, где все население составляет менее 25000000. Показать название, регион и население.

моя попытка:

select name, region, population
from bbc
where region not in 
(select distinct region from bbc 
where population >= 25000000)

Я использовал "не в",Есть ли способ использовать "в"?

Ответы [ 23 ]

6 голосов
/ 25 апреля 2013

Несколько других решений, добавленных для интереса.

Первый запрос:

SELECT name, 
       region 
FROM   bbc x 
WHERE  population > 
       -- this sub query finds each neighbour (not including itself) and returns the max populations multiplied by 3
       (SELECT 3 * MAX(population) 
        FROM   bbc y 
        WHERE  x.region = y.region 
               AND x.name <> y.name) 

Второй запрос:

SELECT name, 
       region, 
       population 
FROM   bbc x 
WHERE  population < ALL 
       -- the ALL keyword allows comparison to be made against all the values in a list 
       -- this sub query finds each country that belongs to a region with populations less than 25 million and returns this as a list
       (SELECT population 
        FROM   bbc y 
        WHERE  y.region = x.region 
               AND population > 25000000) 
6 голосов
/ 17 июня 2011

Для первого:

Вы должны разделить работу.Шаг первый, найдите соседей по стране.Это должно быть автоматическое объединение:

SELECT *
FROM bbc country
    INNER JOIN bbc neighbours
        ON country.region = neighbours.region
        AND country.name != neighbours.name

Не забудьте исключить собственную страну из соседей!

Во-вторых, вы можете подсчитать, сколько соседей в стране имеют нужное население:

sum(CASE WHEN country.population > neighbours.population * 3 THEN 1 ELSE 0 END)
(Group by country !)

Сравните с итогом и все готово!

SELECT countryName 
FROM
(
    SELECT sum(CASE WHEN country.population > neighbours.population * 3 THEN 1 ELSE 0 END) as okNeighbours,
           count(*) as totalNeighbours
           country.name as countryName
    FROM bbc country
        INNER JOIN bbc neighbours
            ON country.region = neighbours.region
            AND country.name != neighbours.name
    GROUP BY country.name
)
WHERE totalNeighbours = okNeighbours

Для второго:

SELECT name, region, population
FROM bbc
WHERE region IN (
    SELECT region
    FROM bbc
    GROUP BY region
    HAVING SUM(CASE WHEN population >= 25000000 THEN 1 ELSE 0 END) = 0
)
6 голосов
/ 27 апреля 2013
SELECT name, region 
FROM bbc x 
WHERE population/3 >= ALL
    (SELECT population
     FROM bbc y
     WHERE y.region=x.region
     AND x.name != y.name)
4 голосов
/ 09 июля 2015

Elad, ваш первый ответ почти правильный, просто пропущен один очень важный компонент:

SELECT x.name, x.continent
  FROM world x
  WHERE x.population >ALL(SELECT population*3
                            FROM world y
                            WHERE y.continent = x.continent
                            AND x.name<>y.name)

Вы видите, когда выполняете подзапрос, проверяющий x.population> 3* (все y.популяции для одного континента) ВЫ ДОЛЖНЫ УКАЗАТЬ, ЧТОБЫ НЕ ПРОВЕРИТЬ ПРОТИВ ОДНОЙ СТРАНЫ ;в противном случае вы заявляете, что проверяете x> 3x, что математически невозможно.

4 голосов
/ 07 мая 2012
SELECT name, region
FROM   bbc x
WHERE  population > 3 *
       (SELECT population 
        FROM bbc y 
        WHERE x.region=y.region
        ORDER BY population DESC limit 1,1)

население, которое вы ищете, в 3 раза больше, чем второе по численности население, то есть предел 1,1.Во втором вопросе пропущен 0, затем он правильный.

SELECT name, region, population 
FROM   bbc x
WHERE  (SELECT SUM(population) 
        FROM bbc y
        WHERE x.region=y.region) < 250000000
1 голос
/ 23 сентября 2016
SELECT name,continent FROM world x WHERE population > ALL(SELECT population*3
FROM world y WHERE x.continent=y.continent and x.name!=y.name)

Я только что столкнулся с этой проблемой прямо сейчас, извините, если я опоздал на годы.ха-ха!Вот как я это сделал.Цель основного оператора выбора состоит в том, чтобы сравнить каждую страну, после чего мы немного искажаем его во внутреннем операторе выбора, который сравнивает страну только на одном континенте / регионе.Также мы добавили условие, при котором страну из внешнего выбора не следует сравнивать с самой собой.

1 голос
/ 31 июля 2012
select name, region from bbc x
where population > all
(select 3*population from bbc y 
where y.region=x.region and population > 0 and x.name <> y.name)
1 голос
/ 04 октября 2015

Чтобы найти название всех стран на континенте, где население всех стран составляет менее 25000000, выполните следующие действия:

  1. Найти максимальное количество населения, сгруппированного по континентам

    (SELECT max(population) 
    FROM world
    GROUP BY continent)
    

Примечание: , так как максимум меньше вашего номера, вы знаете, что все

  1. Найти континент

    SELECT continent
    FROM world
    WHERE population IN(SELECT max(population) 
    FROM world
    GROUP BY continent)
    AND population <= 25000000)
    
  2. Соберите все вместе, чтобы получить название, континент, население

    SELECT name, continent, population
    FROM world
    WHERE continent
    IN(SELECT continent
    FROM world
    WHERE population IN(SELECT max(population) 
    FROM world
    GROUP BY continent)
    AND population <= 25000000)
    
0 голосов
/ 06 марта 2014

Найдите каждую страну, которая относится к континенту, где все население составляет менее 25000000. Показать название, континент и население

Итак, сначала нужно найти континент, где ни в одной стране не должно быть населения> 25000000.

SELECT name, continent, population from world x
WHERE continent in

 (SELECT continent FROM world y

    WHERE 25000000 > 
      (select max(population) from world z
           where y.continent = z.continent))
0 голосов
/ 17 февраля 2016

Используйте этот запрос:

SELECT name, continent 
FROM world x WHERE population/3 > ALL (SELECT population  
                                       FROM world y 
                                       WHERE x.continent = y.continent 
                                             AND x.name != y.name 
                                             AND population > 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...