8
votes

Sous-requêtes SQL

Quelqu'un peut-il m'aider avec ce qui suit:

Certains pays ont des populations plus que trois fois celui de l'un de leurs voisins (dans la même région). Donner les pays et les régions.

mon essai: xxx

syntaxe est correct mais aucun enregistrement n'est renvoyé (devrait renvoyer 3 lignes)

trouver chaque pays appartenant à un région où toutes les populations sont moins que 25000000. Montrer le nom, la région et population.

mon essai: xxx

j'ai utilisé "pas dans". Y a-t-il un moyen d'utiliser "dans"?


2 commentaires

Pour votre "toutes les populations" moins de 25 millions dans une région. Voulez-vous dire que tous les pays individuellement sont moins de 25 millions, ou tous les pays d'une seule région, totalisent moins de 25 millions de ... deux questions totalement différentes.


Il suffit d'ajouter du lien à la question originale où vous pouvez essayer votre solution: sqlzoo.net/wiki/select_within_select_Tutorial # 8


26 Réponses :


0
votes

sur votre deuxième requête, vous pouvez le faire sans dans ou pas dans : xxx

Si vous insistez à l'aide de l'utilisation inverser la condition: xxx


1 commentaires

Ensuite, la sous-requête retournera toutes les régions avec au moins un pays de plus de 250 m. Ce n'est pas ce que j'ai demandé



0
votes

Si je comprends vos données correctement, vous n'avez qu'une seule table. Donc, lorsque vous XXX

Vous obtenez vraiment une liste de tous les pays qui disposent de 25 millions de personnes et de répertorier leurs noms de région. Pour obtenir une liste de régions, vous devez résumer les populations xxx

Vous pouvez maintenant sélectionner les pays de ces régions et montrer leurs informations xxx < / pré>


1 commentaires

Toutes les populations == la population de chaque pays dans cette région



0
votes

Pour la première requête, quelque chose comme ça fonctionne? XXX


0 commentaires

6
votes

Pour le premier:

Vous devez diviser le travail. Première étape, trouvez les voisins pour un pays. Cela doit être une jointure automatique: xxx

n'oubliez pas d'exclure l'auto-pays des voisins!

second, vous pouvez compter combien de voisins pour un pays a la bonne population: xxx

comparer avec le total et que vous avez terminé! xxx

pour la seconde : xxx


0 commentaires

0
votes

Pour votre requête "3 fois sur la population", aucune sous-requête n'est requise ... Juste une jointure auto-rejoindre sur la région, et la population de première instance est> Population de seconde instance * 3. Dans le cas d'une participation auto-jointure Dans sa propre région de la même région, il ne serait jamais rentré depuis que sa population ne serait jamais supérieure à 3 fois sa valeur propre.

En attendant encore des commentaires d'une autre question de population posté comme commentaire dans votre question initiale ... < / p> xxx


1 commentaires

Ma solution initiale était très similaire à celle-ci, et pourtant je ne sais toujours pas pourquoi cela ne fonctionne pas.



5
votes
SELECT name, region, population 
FROM   bbc x
WHERE  (SELECT SUM(population) 
        FROM bbc y
        WHERE x.region=y.region) < 250000000

0 commentaires

0
votes

Pour la deuxième requête, "Trouvez chaque pays appartenant à une région où toutes les populations sont inférieures à 25000000. Montrez le nom, la région et la population." (réf. sqlzoo.net, "Sélectionner dans SELECT ', question 3b ) xxx


1 commentaires

Cela semble équivalent à ne pas spécifier de nombre de population ... À ce stade, vous ne pouvez faire que choisir le nom, la région, la population de BBC;



1
votes
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)

0 commentaires

6
votes

Quelques autres solutions, ajoutés pour intérêt.

première requête: xxx

seconde requête: xxx < / p>


1 commentaires

Solution très efficace et élégante pour le premier. J'aime comment Max est utilisé depuis que cela trouve la prochaine nation la plus grande et la compare ainsi. Mais la deuxième solution donne une sortie incorrecte



12
votes
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)

0 commentaires

0
votes

Trouvez chaque pays qui appartient à un continent où toutes les populations sont inférieures à 25000000. Montrez le nom, le continent et la population

Donc, avant de trouver le continent où tout pays ne devrait pas avoir de population> 25000000. P>

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


0 commentaires

0
votes

Ceci fonctionnera également xxx

dans la requête interne, je sélectionne la deuxième population la plus élevée du continent respectif et dans le où je vérifie si le deuxième plus haut est 3 fois plus petit ou non dans la population.


0 commentaires

0
votes

Pour la première question, le script SQL est: xxx


0 commentaires

0
votes

Je traversai également ces petits défis sur Sqlzoo et ces deux questions particulières que j'ai trouvées difficiles.

Certains pays ont des populations plus de trois fois celle de l'un des leurs voisins (dans le même continent). Donner aux pays et continents.

Ma première tentative était la suivante: xxx

qui me semblait logique. Jusqu'à ce que je me suis rendu compte que si je vérifiais toutes les populations contre toutes les autres populations du continent, y compris elle-même , alors je ne recevrais jamais de résultats, car la population d'un pays ne sera jamais plus qu'on elle-même fois trois. Vous devez donc vérifier tous les autres pays, à l'exclusion du pays que vous vérifiez.

Il existe également deux pays du tableau qui ont une population de NULL, vous devez donc aussi exclure ceux-ci pour satisfaire la question. xxx


0 commentaires

7
votes

ELAD, votre première réponse est presque correct, il manque simplement un composant très clé: xxx

Vous voyez lorsque vous effectuez la sous-requête qui vérifie X. Population> 3 * (toutes les y.populations pour le même continent) Vous devez spécifier de ne pas vérifier contre le même pays ; Sinon, vous déclarez vérifier que x> 3x, qui est mathématiquement impossible.


0 commentaires

1
votes

Pour trouver le nom de tous les pays d'un continent, où tous les pays ont une population de moins de 25000000, procédez comme suit:

  1. trouver le maximum (population) groupé par continent p>

    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)
    


0 commentaires

0
votes

Utilisez cette requête:

SELECT name, continent 
FROM world x WHERE population/3 > ALL (SELECT population  
                                       FROM world y 
                                       WHERE x.continent = y.continent 
                                             AND x.name != y.name 
                                             AND population > 0)


1 commentaires

Je ne vois pas la différence entre ce que j'ai publié comme une solution, qui a fonctionné et ce que vous avez posté, ce qui est littéralement la même chose, à part la police. Je suis nouveau dans ce monde - avez-vous édité mon message à cause de la police?



1
votes
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)
I've just encountered this problem right now, so sorry if I'm years late. haha! This is how I did it. The purpose of the main select statement is to compare every country then we twist it a little bit in the inner select statement which compares country in the same continent/region only. Also we added a condition where the country from outer select shouldn't be compared with itself.

0 commentaires

0
votes

Pour la première question: vous devez ajouter une autre ligne de code et b.name <> nom xxx

pour la deuxième question: vous pouvez Débarrassez-vous des deux pas dans et dans à l'aide de tout xxx


0 commentaires

0
votes

Cette requête vous aidera.

Sélectionnez Nom, Continent du monde A Où population> Tout (sélectionnez la population * 3 du monde B où A.Continent = B.Content et a.name! = B.Name)


0 commentaires

1
votes
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 commentaires

-1
votes

Trouvez les continents où tous les pays ont une population <= 25000000. Trouvez ensuite les noms des pays associés à ces continents. Montrer le nom, le continent et la population.

solution xxx


0 commentaires

-1
votes

Trouvez les continents où tous les pays ont une population <= 25000000 . Trouvez ensuite les noms des pays associés à ces continents. Afficher nom , continent et population .

C'est ma solution et il semble être le plus simple de tout ce qui précède: xxx


0 commentaires

0
votes

La bonne réponse montre que 3 paysilles de pays dans le monde entier. Peut-être que je manque quelque chose. Il devrait y avoir de nombreux pays qui ont 3x + population à leur voisin, en supposant que le voisin ne soit défini que comme pays dans le même continent.

C'est-à-dire que l'Afghanistan a une population de 25 millions de personnes, tandis que Bahreïn en Asie a 1,2 million de dollars, ce qui rend l'Afghanistan chemin de plus de 3 fois par rapport à son voisin de Bahreïn. Donc, cela devrait être une solution de réponse correcte trop droite?


0 commentaires

0
votes

Cette requête retournera la sortie souhaitée

Sélectionnez PaysName, Continent DE ( Sélectionnez Somme (cas lorsque W1.Population> W2.Population * 3 puis 1 autre 0 extrémité) en finaleOutput, compter (*) comme totaleighbours, w1.nom comme paysName, W1.Cont-il en tant que continent Du monde w1 Rejoindre intérieur World W2 Sur w1.Continent = w2.Continent Et w1.name! = W2.name Groupe par pays.name ) comme tbl Où totaleighbours = finalOutput


0 commentaires

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

1 commentaires

L'ajout de commentaires contribuera grandement à expliquer pourquoi cela résout la question de l'OP. Juste un morceau de code seul n'est pas aussi utile.