SQL ZOO列出每个大洲以及按字母顺序排在第一位的国家/地区的名称

时间:2017-07-04 06:00:27

标签: mysql sql correlated-subquery

我很困惑为什么它不能

Select x.continent, x.name
From world x
Where x.name <= ALL (select y.name from world y where x.name=y.name)
ORDER BY name

任何人都可以向我解释为什么它必须是x.continent = y.continent而不是x.name = y.name?

Table

10 个答案:

答案 0 :(得分:4)

当您使用Access-Control-Allow-Methods: POST, PUT, GET, OPTIONS 时,如果两个实例具有相同的国家/地区名称,则您将x的国家/地区名称与y的国家/地区名称进行比较。这基本上只会让你回到全桌x。

您想要使用x.name=y.name,因为您只想将x中的实例的国家/地区名称与y中的实例的国家/地区名称进行比较(如果它们共享同一个大陆)。

让我用一个例子逐步说明: 这里我们有一个表格世界,我填充了一些数据:

x.continent=y.continent

当您在子查询中没有WHERE子句的情况下执行此查询时:

world: 

Select  x.continent, x.name
From world x
ORDER BY  name

continent       name
Asia            Afghanistan
Europe          Albania
Africa          Algeria  
Europe          Andorra
Africa          Angola
SouthAmerica    Bolivia
SouthAmerica    Brazil
Europe          Hungary
Asia            Japan
Africa          Nigeria
SouthAmerica    Peru
Asia            Taiwan

你得到了这个

Select  x.continent, x.name
From world x
Where x.name <= ALL (select y.name from world y)
ORDER BY name

这是因为where子句过滤了除一个国家外的所有国家

continent   name
Asia        Afghanistan

,即按字母顺序排在阿富汗的国名。

但是由于我们希望获得每个大洲的第一个国家/地区,我们会将where x.name <= (Afghanistan,Taiwan,Japan, Albania,Hungary,Algeria,Nigeria,Andorra, Angola,Bolivia,Peru,Brazil) 添加到我们的子查询中

x.continent=y.continent

下面发生的事情是,现在我们只是将x中的实例的国家/地区名称与y中的实例的国家/地区名称进行比较,如果它们共享同一个大陆。因此,以亚洲大陆为例:

Japen因为过滤掉了 Select x.continent, x.name From world x Where x.name <= ALL (select y.name from world y where x.continent=y.continent) ORDER BY name 是错误的,因为日本不低于或等于阿富汗(A出现在J之前)

台湾因为过滤掉了 Japan <= All(Afghanistan,Taiwan,Japan)是错误的,因为台湾不低于或等于阿富汗。

阿富汗没有被过滤掉,因为 由于阿富汗与阿富汗相等,Taiwan <= All(Afghanistan,Taiwan,Japan)是正确的

但是,如果您在子查询中使用Afghanistan <= All(Afghanistan,Taiwan,Japan),那么您实际上是将每个国家/地区与自身进行比较,并且它们都将包含在您的最终结果集中,因为所有国家/地区名称都等于其自己的国家/地区名称。

我希望这有帮助,欢迎来到Stack Overflow。如果此答案或任何其他答案解决了您的问题,请将其标记为已接受。“

答案 1 :(得分:0)

 select A.continent, A.name 
 from
 (Select  x.continent, x.name, RANK() OVER(PARTITION BY x.continent ORDER BY x.name 
 asc)AS Rank  
 From world x
 group by  x.continent, x.name)A
 where
 Rank = 1

答案 2 :(得分:0)

这是正确的答案:

Select continent,name 
from world x
Where x.name <= ALL(select y.name from world y
                    where x.continent=y.continent)
ORDER BY continent

答案 3 :(得分:0)

这很容易,因为min func将按字母顺序返回第一个单词。

SELECT continent, name FROM world x WHERE name = (SELECT min(name) FROM world y WHERE x.continent = y.continent );

答案 4 :(得分:0)

这也会产生正确的答案。

SELECT continent, name
FROM world a
WHERE name <= ALL(SELECT name FROM world b
               WHERE a.continent = b.continent)

答案 5 :(得分:0)

我试过了,它也有效:

SELECT continent, MIN(name)
FROM world
GROUP BY continent

答案 6 :(得分:0)

这里有一个注意事项 - 要正确回答这个问题,ORDER BY 是不必要的,对于最简单的解决方案,您只需要:

SELECT continent, name
FROM world w1
WHERE w1.name <= ALL(SELECT name 
                       FROM world w2
                       WHERE w1.continent=w2.continent)

答案 7 :(得分:0)

按字母顺序列出每个大陆和国家名称。

<块引用>

选择大洲,名称 来自世界x 其中名称在(选择分钟(名称) 来自世界y 其中 x.Continent= y.continent)

答案 8 :(得分:0)

SELECT
    continent, name
FROM
    world x
WHERE
    name <= ALL(SELECT name FROM world y WHERE x.continent=y.continent ORDER BY name )
ORDER BY continent

返回一个有序的国家名称列表,然后返回这个列表的第一个条目,最后按大洲排序外部选择查询。

答案 9 :(得分:-2)

SELECT continent, name 
FROM world as x
WHERE name = ALL(SELECT min(name)
                 FROM world y
                 WHERE x.continent = y.continent);