2017-07-04 4 views
0

Im confus pourquoi il ne pouvait pas êtreSQL ZOO Liste chaque continent et le nom du pays qui vient en premier par ordre alphabétique

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 

Quelqu'un peut-il s'il vous plaît me expliquer pourquoi il doit être x.continent = y.continent et pas x.name = y.name?

Table

+0

Vous devez fournir plus de contexte pour votre question.Quel résultat es-tu en train d'essayer de faire que "ça" doit être "x.continent = y.continent'"? Est-ce parce que lorsque vous utilisez 'x.name = y.name' vous n'obtenez pas le résultat souhaité? ou est-ce parce que vous obtenez une erreur? S'il vous plaît soyez précis sur votre question. –

+0

@ O.KOO Si j'utilisais x.name = y.name, la réponse serait incorrecte. – teamking12

+0

bien, quelle est votre réponse/résultat souhaité? –

Répondre

1

lorsque vous utilisez x.name=y.name vous comparez le nom du pays de x avec le nom du pays de y, si les deux instances ont le même nom de pays. Cela reviendrait simplement à vous renvoyer la table complète x.

Vous souhaitez utiliser x.continent=y.continent car vous ne souhaitez comparer le nom d'une instance de x qu'avec le nom d'une instance de y si le même continent se trouve dans le même pays.

Permettez-moi d'illustrer cette étape par étape avec un exemple: Ici, nous avons un monde de table et je peuplé avec des données:

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 

lorsque vous exécutez cette requête sans la clause WHERE dans votre sous-requête:

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

vous obtenez ce

continent name 
Asia  Afghanistan 

C'est bec ause the where clause filtré tous sauf un pays

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

et à savoir, le nom de pays qui vient en premier dans l'ordre alphabétique qui est l'Afghanistan.

mais étant donné que nous voulons obtenir le premier pays chaque continent nous ajouterons x.continent=y.continent à notre sous-requête

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 

ce qui se passe est en dessous que maintenant nous ne comparons le nom du pays d'une instance de x avec le nom de pays d'une instance de y s'ils partagent le même continent. Il faut donc utiliser continent de l'Asie par exemple:

Japen obtient filtré parce Japan <= All(Afghanistan,Taiwan,Japan) est faux puisque le Japon n'est pas inférieure ou égale à l'Afghanistan (A vient avant J)

Taiwan obtient filtré parce Taiwan <= All(Afghanistan,Taiwan,Japan) est faux depuis Taïwan n'est ni inférieur ni égal à l'Afghanistan.

Afghanistan ne soit filtré parce que Afghanistan <= All(Afghanistan,Taiwan,Japan) n'est vrai que l'Afghanistan est égale à l'Afghanistan

Cependant, si vous utilisez x.name=y.name dans votre sous-requête, vous êtes essentiellement la comparaison de chaque pays à lui-même et ils auront tous inclus dans votre ensemble de résultats définitifs, car tous les noms de pays sont égaux au nom de pays lui-même.

J'espère que cette aide et bienvenue à Stack Overflow. Si cette réponse ou une autre solution a résolu votre problème, veuillez le marquer comme accepté. "

+0

@O KOO Merci. Appréciez votre explication: D – teamking12