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

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 ]

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

Для первого запроса будет ли что-то подобное работать?

SELECT
a.region  , b.*
FROM 
bbc  a
INNER JOIN 
(SELECT population , (population  * 3) AS PopX3, region  FROM bbc  ) b
ON
a.population  < PopX3
AND
a.region <> b.region
0 голосов
/ 10 мая 2015

Я также проходил через эти небольшие проблемы в SQLZOO, и эти два конкретных вопроса я нашел хитрыми.

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

Моя первая попытка была:

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

Что показалось мне логичным. До тех пор, пока я не осознал, что, если бы я проверял каждую популяцию по отношению к любой другой популяции на континенте, включая , включая самого себя , я бы никогда не получил никаких результатов, поскольку численность населения страны никогда не будет больше, чем она сама три. Поэтому вам нужно проверить любую другую страну, за исключением страны, с которой вы проверяете.

В таблице также есть две страны с населением NULL, поэтому вы также должны исключить их, чтобы удовлетворить вопрос.

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)
AND population > 0
0 голосов
/ 15 января 2015

Для первого вопроса SQL-скрипт:

SELECT w1.name,w1.continent
FROM world w1
WHERE w1.population > 3 * (
SELECT max(w2.population)
FROM world w2
WHERE w2.continent = w1.continent
AND w2.name <> w1.name
GROUP BY w2.continent
)
0 голосов
/ 27 декабря 2014

Это также будет работать

       SELECT name, continent 
       FROM world x 
       WHERE population >= 3* (SELECT population FROM world y
       WHERE y.continent=x.continent
       AND population>0 ORDER BY population DESC LIMIT 1 OFFSET 1 )

Во внутреннем запросе я выбираю вторую по численности популяцию на соответствующем континенте и там, где я проверяю, является ли вторая по численности популяция в 3 раза меньше или нет в популяции.

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

Если я правильно понимаю ваши данные, у вас есть только одна таблица.Поэтому, когда вы

Select distinct region from bbc where population >=25000000)

, вы действительно получаете список всех стран, у которых есть 25 млн., И список их регионов.Чтобы получить список регионов, вам нужно СУММИТЬ население

Select region, sum(population) as regionpop from bbc group by region having sum(population)>25000000

Теперь вы можете выбрать страны из этих регионов и показать их информацию

Select name, region, population from bbc where region in 
(Select region from bbc group by region having sum(population)>25000000)
0 голосов
/ 08 февраля 2019
select x.name, x.continent
from world x
where x.population > 3 * (select y.population from world as y where x.continent = y.continent and x.name <> y.name order by y.population desc limit 1)
0 голосов
/ 21 декабря 2016

По первому вопросу: вам нужно добавить еще одну строку кода AND B.name <> A.name

SELECT name, region  
FROM bbc A
WHERE A.population/3 >= ALL(SELECT population FROM bbc B 
                                              WHERE B.region = A.region 
                                              AND   B.name  <> A.name)

По второму вопросу: вы можете избавиться от NOT IN и IN, используя ALL

SELECT name, region, population
FROM bbc A
WHERE 25000000 >= ALL(SELECT population FROM bbc B 
                                        WHERE B.region = A.region)
0 голосов
/ 17 июня 2011

Для вашего запроса "3-кратное заполнение" подзапрос не требуется ... просто самостоятельное присоединение к региону, а заполнение первого экземпляра> заполнение второго экземпляра * 3. В случае получения самостоятельного соединения в свою страну в том же регионе, он никогда не будет возвращен, поскольку его население никогда не будет больше чем в 3 раза больше его собственной стоимости.

Все еще жду обратной связи с другим вопросом о населении, опубликованным в качестве комментария в исходном вопросе ...

select
      b1.Name,
      b1.Region,
      b1.Population,
      b2.Name SmallerCountry,
      b2.Population SmallerPopulation
   from
      bbc b1
         join bbc b2
             on b1.Region = b2.Region
            AND b1.Population > b2.Population * 3
0 голосов
/ 22 мая 2012

Для второго запроса: «Найдите каждую страну, относящуюся к региону, где все группы населения меньше 25000000. Показать название, регион и население». (ссылка sqlzoo.net, «ВЫБРАТЬ внутри ВЫБРАТЬ», вопрос 3b )

SELECT name, region, population FROM bbc
 WHERE region NOT IN
     ( SELECT DISTINCT region FROM bbc
        WHERE population >= 25000000 )
   AND region IN
     ( SELECT DISTINCT region FROM bbc
        WHERE population < 25000000 )
0 голосов
/ 09 августа 2018

этот запрос поможет вам.

select name,continent from world a where population >all(select population*3 from world b where a.continent=b.continent and a.name!=b.name)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...