sql子查询

时间:2011-06-17 12:27:13

标签: sql subquery

任何人都可以帮助我:

  

有些国家的人口更多   比他们任何人的三倍多   邻居(在同一地区)。给   国家和地区。

我的尝试:

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

语法正确但没有返回任何记录(应返回3行)

  

查找属于a的每个国家/地区   所有人口较少的地区   比25000000.显示名称,区域和   人口。

我的尝试:

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

我用“不在”。有没有办法使用“in”?

27 个答案:

答案 0 :(得分:6)

第一个:

你必须分工。第一步,找到一个国家的邻居。 这必须是自动加入:

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
)

答案 1 :(得分:6)

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)

答案 2 :(得分:6)

其他一些解决方案,为了兴趣而增加。

首先查询:

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) 

答案 3 :(得分:4)

很高兴,你的第一个答案是几乎正确,只是遗漏了一个非常关键的组成部分:

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&gt; 3 *(所有y.populations为同一个大陆)你必须指明不检查同一个国家;否则你说要检查x> 3x,这在数学上是不可能的。

答案 4 :(得分:4)

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

答案 5 :(得分:1)

要查找所有国家/地区人口少于25000000的所有国家/地区的名称,请执行以下操作:

  1. 查找按大陆分组的最大(人口)

    (SELECT max(population) 
    FROM world
    GROUP BY continent)
    
  2. 注意:因为最大值小于你的号码,你知道所有都是

    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)
      

答案 6 :(得分:1)

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)

我刚刚遇到这个问题,很抱歉,如果我迟到了。哈哈!这就是我做到的。主要选择语句的目的是比较每个国家,然后我们在内部选择语句中稍微扭曲一下,该语句仅比较同一洲/区域的国家。此外,我们还添加了一个条件,即外部选择的国家不应与自身进行比较。

答案 7 :(得分:1)

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)

答案 8 :(得分:0)

查找所有国家都有population <= 25000000的大洲。然后找到与这些大洲相关的国家的名称。显示namecontinentpopulation

这是我的解决方案,它似乎是以上所有方法中最简单的一种:

SELECT name, continent, population FROM world 
WHERE continent NOT IN (SELECT continent FROM world WHERE population > 25000000)

答案 9 :(得分:0)

正确答案显示全世界仅3个国家/地区的结果。也许我想念一些东西。假设邻居仅被定义为同一大陆上的一个国家,那么应该有很多国家的邻居人口超过3倍。

IE,阿富汗有2500万人口,而亚洲的巴林有120万人口,这使其阿富汗人口比邻国巴林大3倍。所以那应该是正确的答案选择吗?

答案 10 :(得分:0)

查找所有国家/地区人口<= 25000000的大洲。然后查找与这些大洲相关的国家/地区的名称。显示名称,大洲和人口。

解决方案

select name, continent, population
from world x where 25000000>= 
all(select population from world z where x.continent = z.continent);

答案 11 :(得分:0)

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)

答案 12 :(得分:0)

此查询将为您提供帮助。

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)

答案 13 :(得分:0)

对于第一个问题:您必须添加另一行代码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

摆脱INALL
SELECT name, region, population
FROM bbc A
WHERE 25000000 >= ALL(SELECT population FROM bbc B 
                                        WHERE B.region = A.region)

答案 14 :(得分:0)

此查询将返回所需的输出

SELECT countryName, continent FROM ( SELECT sum(CASE WHEN w1.population > w2.population * 3 THEN 1 ELSE 0 END) as finaloutput, count(*) as totalNeighbours, w1.name as countryName, w1.continent as continent FROM world w1 INNER JOIN world w2 ON w1.continent= w2.continent AND w1.name != w2.name GROUP BY country.name ) as tbl WHERE totalNeighbours = finaloutput

答案 15 :(得分:0)

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);

答案 16 :(得分:0)

对于第一个问题,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
)

答案 17 :(得分:0)

使用此查询:

task_type=all&keyword=asdfsd&location=Vasant Kunj&category=17&subcategory=19&price[]=&price[]=100&price[]=300&price[]=500&price[]=above&educations[]=&educations[]=22&educations[]=29&industry[]=&industry[]=1&industry[]=7&experience=6&freshness=1

答案 18 :(得分:0)

我也经历过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

答案 19 :(得分:0)

在第二个查询中,您可以在不INNOT IN

的情况下执行此操作
SELECT name, region, population
from bbc
where population >= 25000000

如果你坚持使用IN,只需改变条件:

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

答案 20 :(得分:0)

这也可行

       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倍。

答案 21 :(得分:0)

SELECT
 name, region, population
  FROM
   world
    WHERE
     region NOT IN
(SELECT
 region 
  FROM
   world
    WHERE
       region > 25000000
GROUP BY region)

答案 22 :(得分:0)

查找属于所有人口少于25000000的大陆的每个国家。显示名称,大陆和人口

首先需要找到任何国家不应该有人口的大陆&gt; 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))

答案 23 :(得分:0)

对于第二个查询,“查找属于所有人口均小于25000000的区域的每个国家/地区。显示姓名,地区和人口。” (参考sqlzoo.net, 'SELECT within SELECT', question 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 )

答案 24 :(得分:0)

对于“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

答案 25 :(得分:0)

对于第一个查询,这样的工作会起作用吗?

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

答案 26 :(得分:0)

如果我正确理解您的数据,您只有一张表。所以,当你

Select distinct region from bbc where population >=25000000)

你真的得到了所有25mil国家的名单并列出了他们的地区名称。要获取区域列表,您必须总结人口

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)