penser en termes d'ensembles, pas d'itérateurs; les instructions sql définissent les propriétés de l'ensemble de sortie souhaité (aka table / relation)
tous les lieuxNoms tels que pour chaque groupePays il y a un groupe de ce pays qui joue dans le lieu de ce nom
le résultat de cela (si j'ai bien compris vos intentions!) serait l'ensemble des salles qui ont au moins un groupe qui joue dans cette salle. L'itération sur bandCountry n'est pas nécessaire, car la relation PLAYS a déjà les informations que vous recherchez, il vous suffit d'éliminer les doublons
donc en SQL ce serait:
select
distinct venueName
from PLAYS
EDIT: ok, donc l'ensemble réel souhaité est un peu plus compliqué. La question posée à la base de données est: quels lieux ont accueilli des groupes de tous les pays?
Ainsi, nous définissons les critères d'appartenance à un élément de l'ensemble souhaité comme objectif, puis travaillons à l'envers pour remplir l'ensemble. Un lieu est membre de l'ensemble de sortie s'il a une ligne PLAYS pour au moins un groupe de chaque pays. Comment obtenons-nous ces informations?
Une façon consiste à compter les pays distincts pour chaque site et à les comparer au nombre de tous les pays. Mais nous n'avons pas de relation PAYS. Si nous réfléchissons un instant au modèle donné, nous voyons que l'ensemble de tous les pays n'est pas le bon critère; c'est l'ensemble de tous les pays qui ont au moins une bande. Nous n'avons donc pas besoin d'une table de pays (bien que pour un modèle normalisé nous devrions en avoir une), et nous ne nous soucions pas du pays du lieu, nous pouvons simplement compter les pays qui ont des bandes, par exemple (dans MS-SQL )
declare @BandCountryCount int
select
@BandCountryCount = COUNT(distinct bandCountry)
from BAND
Nous pouvons compter les pays du groupe pour chaque lieu
select
P.venueName, COUNT(distinct B.bandCountry) as VenueBandCountryCount
from PLAYS P
inner join BAND B on B.bandName = P.bandName
et nous pouvons assembler les deux en utilisant une sous-requête
select
venueName
from (
select
P.venueName, COUNT(distinct B.bandCountry) as VenueBandCountryCount
from PLAYS P
inner join BAND B on B.bandName = P.bandName
) X
where X.VenueBandCountryCount = @BandCountryCount
Maintenant, ce n'est pas la plus jolie requête possible (GROUP BY et HAVING pourraient être considérés comme une solution plus `` élégante '' que les variables temporaires et une sous-requête), mais il est assez évident de savoir ce que nous recherchons, nous allons donc en rester là pour le but de l'OP .
Le but du PO était d'apprendre à faire passer l'état d'esprit de l'impératif au déclaratif. À cette fin, regardez ce que la solution impérative décrite faisait:
pour chaque lieu, nommez tous les groupes de pays et pour chaque groupe de pays, obtenez la liste des groupes qui en proviennent. Si aucun d'entre eux ne joue dans lieuName, passez au lieu suivant. Sinon, à la fin de l'itération bandCountries, ajoutez lieuName à l'ensemble des bons lieuxNoms
Quels sont les critères déterminants ci-dessus? Je pense que c'est:
... Si aucun d'entre eux [l'ensemble des groupes d'un pays particulier] ne joue dans venueName ...
Il s'agit d'un critère de disqualification . Le processus de pensée impératif commence par un seau plein et jette des choses qui ne correspondent pas aux critères. Nous filtrons les données.
C'est bien pour des choses simples, mais cela aide à penser en termes de construction de l'ensemble de résultats souhaité; quels sont les critères de qualification correspondants qui permettraient de remplir le seau à la place?
- disqualifier: s'il n'y a pas de groupe d'un groupe de pays qui joue dans un lieu, le lieu est disqualifié
- qualificatif (partiel): si au moins un groupe d'un groupe de pays joue sur un lieu, le lieu peut être correct; continuez à vérifier le reste du groupe
- qualificatif (complet): si au moins un groupe de chaque groupe joue dans un lieu, le lieu est qualifié
Le qualificatif final peut être simplifié en utilisant les décomptes: un groupe de pays est «satisfait» si au moins un groupe de là joue sur un site; le nombre de pays de bande «satisfaits» pour un lieu doit être égal au nombre de pays de bande pour le lieu à qualifier.
Maintenant, nous pouvons raisonner à travers les relations par navigation:
- commencer par la relation VENUE [nous n'en avons pas besoin pour la réponse, mais c'est le point de départ conceptuel de la navigation relationnelle]
- rejoindre PLAYS sur venueName
- rejoindre BAND sur bandName pour obtenir le groupe
- nous ne nous soucions pas du nom du groupe; sélectionner uniquement le lieuName et le groupeCountry
- nous ne nous soucions pas des pays de bande redondants; éliminer les doublons à l'aide de DISTRICT ou GROUP BY
- nous ne nous soucions que du nombre de pays distincts, pas des noms
- nous ne voulons que des lieux où le nombre de pays de bande distincts est le même que le nombre total de pays de bande
ce qui nous ramène à la solution ci-dessus (ou à un fac-similé raisonnable de celle-ci)
SOMMAIRE
- théorie des ensembles
- chemins de navigation relationnelle
- critères inclusifs vs exclusifs (qualification vs disqualification)