kümeler açısından düşünün, yineleyiciler değil; sql deyimleri istenen çıktı kümesinin özelliklerini tanımlar (aka tablo / ilişki)
tüm mekanNames, öyle ki her grup için, bu ülkeden o isimdeki yerde oynayan bir grup var.
Bunun sonucu (niyetinizi doğru anladıysam!) o mekanda en az bir gruba sahip olan mekânlar olurdu. BandCountry üzerindeki yineleme gereksizdir, çünkü PLAYS ilişkisi zaten aradığınız bilgilere sahip olduğundan, yinelemeleri kaldırmanız gerekir.
yani SQL'de bu olacaktır:
select
distinct venueName
from PLAYS
EDIT: tamam, yani istenen gerçek set biraz daha karmaşık. Veritabanından sorulan soru şudur: Hangi ülkelerde tüm ülkelerden gruplar yer almıştır ?
Böylece, istenen kümenin bir öğesi için üyelik ölçütlerini hedef olarak tanımlarız, sonra kümeyi doldurmak için geriye doğru çalışırız. Her ülkeden en az bir grup için bir PLAYS sırası varsa, bir yer setin bir üyesidir. Bu bilgiyi nasıl alırız?
Bunun bir yolu, her bölge için farklı ülkeleri saymak ve onu tüm ülkelerin sayısı ile karşılaştırmaktır. Ancak ÜLKE ilişkimiz yok. Bir an için verilen modeli düşünürsek, tüm ülkelerin kümesinin doğru kriterler olmadığını görüyoruz; en az bir gruba sahip tüm ülkelerin kümesidir. Bu yüzden bir ülke masasına ihtiyacımız yok (normalize edilmiş bir model için sahip olmamız gerekse de) ve mekanın ülkesini umursamıyoruz, sadece gruplara sahip ülkeleri sayabiliriz, örneğin (MS-SQL’de )
declare @BandCountryCount int
select
@BandCountryCount = COUNT(distinct bandCountry)
from BAND
Her bölge için grup ülkeleri sayabiliriz
select
P.venueName, COUNT(distinct B.bandCountry) as VenueBandCountryCount
from PLAYS P
inner join BAND B on B.bandName = P.bandName
ve bir alt sorgu kullanarak ikisini bir araya getirebiliriz
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
Şimdi, mümkün olan en güzel sorgu bu değil (GROUP BY ve HAVING, geçici değişkenlerden ve bir alt sorgudan daha 'şık' bir çözüm olarak görülebilir) ancak peşinde olduğumuz şey oldukça açıktır, bu nedenle OP'nin amacına bırakacağız. .
OP'nin amacı, zihniyetin zorunlu olandan bildirimselliğe nasıl geçirileceğini öğrenmek oldu. Bu amaçla, açıklanan zorunlu çözümün ne yaptığına bakın:
her mekanName için tüm bandCountries üzerinde yineleme yapın ve her bandCountry için ondan gelen grupların listesini alın. Hiçbiri mekanName'de oynamıyorsa, bir sonraki mekana geç. Aksi halde, bandın sonundaCountries yineleme, iyi bir mekan olan Names'e venueName ekleyin.
Yukarıdakilerde belirleyici kriterler nedir? Sanırım öyle:
... hiçbiri [belirli bir ülkeden grupların grubu] mekanName'de oynamazsa ...
Bu diskalifiye edici bir kriterdir . Zorunlu düşünce süreci tam bir kova ile başlıyor ve kriterlere uymayan şeyler atıyor. Biz ediyoruz filtreleyerek verileri.
Bu basit şeyler için iyidir, ancak istenen sonuç kümesinin oluşturulması açısından düşünmeye yardımcı olur; İlgili nedir eleme kriterleri biri yerine kovayı doldurmak için izin verecek?
- diskalifiye edici: Eğer bir mekanda oynayan bir bandCountry'den grup yoksa, mekan diskalifiye edilir.
- (kısmi) niteleyici: bir bandCountry'den en az bir grup bir mekanda oynarsa, mekan iyi olabilir; bandın geri kalanını kontrol etmeye devam et
- (tam) niteleyici: Her bir gruptan en az bir grupCountry bir mekanda oynuyorsa, o yer niteliklidir
Son niteleyici sayıları kullanarak basitleştirilebilir: oradan en az bir grup bir mekanda oynarsa, bir bandCountry 'memnun'; Bir mekan için 'memnun' grup ülke sayısı, mekanın kalifiye olması için grup ülke sayısına eşit olmalıdır.
Artık navigasyon yoluyla ilişkiler arasında sebep olabiliriz:
- VENUE ilişkisiyle başlayın [cevap için buna ihtiyacımız yok, ancak ilişkisel gezinme için kavramsal başlangıç noktası]
- venueName PLAYS'e katıl
- bandCountry'i almak için bandName'deki BAND'a katılın
- grubun adını umursamıyoruz; sadece mekan seçinAdı ve bandCountry
- Gereksiz bant sayıları umrumda değil; DISTRICT veya GROUP BY kullanarak kopyaları ortadan kaldırmak
- isimleri değil, yalnızca farklı bandCountries sayısını önemsiyoruz
- biz sadece farklı bandCountries sayısının toplam bandCountries sayısı ile aynı olduğu yerlerde istiyoruz.
bu da yukarıdaki çözüme geri götürür (veya makul bir faksal)
ÖZET
- küme teorisi
- ilişkisel gezinme yolları
- kapsayıcı ve özel kriterler dahil