2017-07-04 14 views
0

林混淆的名称为什么不能SQL ZOO列表中的每个大洲和国家的自带首字母顺序排列

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

+0

您需要为您的问题提供更多背景。你试图达到什么样的结果使得“它”必须是“x.continent = y.continent”?是因为当使用'x.name = y.name'时,你没有得到你想要的结果?还是因为你收到错误?请具体说明你的问题。 –

+0

@ O.KOO如果我使用了x.name = y.name,那么答案会不正确。 – teamking12

+0

那么,你想要的答案/结果是什么? –

回答

1
当您使用

x.name=y.name你是从X与国名从y中比较国名,如果这两种情况下具有相同的国名。这基本上只会返回你的全表x。

你想使用x.continent=y.continent,因为如果你只想将来自x的实例的国家名称与来自y的实例的国家名称比较,如果它们共享相同的大陆。

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

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 

,当你执行这个查询,而无需在子查询的WHERE子句:

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

你得到这个

continent name 
Asia  Afghanistan 

这是BEC使用where子句过滤除了一个国家以外的所有国家

where x.name <= (Afghanistan,Taiwan,Japan, 
       Albania,Hungary,Algeria,Nigeria,Andorra, 
       Angola,Bolivia,Peru,Brazil) 

也就是,按字母顺序排列的是阿富汗的国名。

,但由于我们想要得到的第一个国家每个大洲我们将增加x.continent=y.continent我们的子查询

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 

什么是下面发生的事情是,我们现在只能从比较实例的国名x与来自y的实例的国名如果他们共享相同的大陆。因此,使用大陆地区的,例如:

Japen被过滤掉,因为 Japan <= All(Afghanistan,Taiwan,Japan)是假的,因为日本不小于或等于阿富汗(A自带Ĵ之前)

台湾被过滤掉,因为 Taiwan <= All(Afghanistan,Taiwan,Japan)是假的,因为台湾不亚于阿富汗。

阿富汗不会被过滤掉,因为 Afghanistan <= All(Afghanistan,Taiwan,Japan)是真实的,因为阿富汗是等于阿富汗

但是,如果你在你的子查询中使用x.name=y.name那么你是各个国家基本上是与自己进行比较,他们都将获得包括在你的最终结果集,因为所有的国家名称等于它自己的国家名称。

我希望这个帮助,并欢迎堆栈溢出。如果此答案或任何其他人解决了您的问题,请将其标记为已接受。“

+0

@O KOO谢谢。感谢您的解释:D – teamking12