イテレータではなくセットの観点から考えてください。SQLステートメントは、目的の出力セット(別名テーブル/リレーション)のプロパティを定義します
すべてのVenueNamesのように、すべてのバンドに対して国はその国のバンドがその名前のVenueで演奏します
この結果(私があなたの意図を正しく理解していれば!)は、その会場で演奏する少なくとも1つのバンドを持つ会場のセットになります。PLAYSリレーションには探している情報が既に含まれているため、bandCountryの繰り返しは不要です。重複を排除するだけです。
したがって、SQLでは次のようになります。
select
distinct venueName
from PLAYS
編集:わかりました。したがって、実際に必要なセットはもう少し複雑です。データベースについて尋ねられる質問は、次のとおりです。すべての国からどの会場でバンドがホストされていますか?
そのため、目的のセットの要素のメンバーシップ基準を目標として定義し、逆方向に作業してセットに値を設定します。会場は、すべての国の少なくとも1つのバンドのPLAYS行がある場合、出力セットのメンバーです。この情報をどのように取得しますか?
1つの方法は、各会場の個別の国をカウントし、それをすべての国のカウントと比較することです。しかし、国との関係はありません。しばらく与えられたモデルについて考えると、すべての国のセットが正しい基準ではないことがわかります。少なくとも1つのバンドを持つすべての国のセットです。したがって、国テーブルは必要ありません(正規化されたモデルの場合は1つ必要です)。開催地の国は気にしません。たとえば、MS-SQL )
declare @BandCountryCount int
select
@BandCountryCount = COUNT(distinct bandCountry)
from BAND
各会場のバンドの国をカウントできます
select
P.venueName, COUNT(distinct B.bandCountry) as VenueBandCountryCount
from PLAYS P
inner join BAND B on B.bandName = P.bandName
そして、サブクエリを使用して2つをつなぎ合わせることができます
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
今、それは可能な限りきれいなクエリではありません(GROUP BYとHAVINGは一時変数とサブクエリよりも「エレガントな」ソリューションと見なされるかもしれません) 。
OPの目的は、考え方を命令型から宣言型に変える方法を学ぶことでした。そのために、記述された命令型ソリューションが何をしていたかを見てください。
それぞれのVenueNameについて、すべてのbandCountriesを反復処理し、各bandCountryについて、そこから来るバンドのリストを取得します。いずれもvenueNameでプレイしない場合は、次のvenueNameに進みます。それ以外の場合、bandCountries反復の最後に、venueNameを適切なvenueNamesのセットに追加します
上記の決定基準は何ですか?私はそう思う:
...いずれも[特定の国のバンドのセット]がVenueNameで再生されない場合...
これは失格基準です。必須の思考プロセスは、完全なバケットから開始し、基準に適合しないものを捨てることです。私たちはしているフィルタリングデータを。
単純なものにはこれで問題ありませんが、目的の結果セットを構築する観点から考えると役立ちます。代わりにバケットを埋めることができる対応する資格基準は何ですか?
- 失格者:会場で演奏するbandCountryのバンドがない場合、会場は失格となります
- (部分)修飾子:bandCountryの少なくとも1つのバンドが会場で演奏する場合、会場は大丈夫かもしれません。バンドの残りの国をチェックし続ける
- (full)qualifier:各バンドの国の少なくとも1つのバンドが会場で演奏する場合、会場は限定されます
最後の修飾子は、カウントを使用して簡略化できます。1つ以上のバンドが会場で再生される場合、bandCountryは「満足」です。会場の「満足」バンド国の数は、会場の資格を得るためのバンド国の数と等しくなければなりません。
これで、ナビゲーションによって関係全体を推論できます。
- VENUEリレーションから開始します[答えには必要ありませんが、リレーショナルナビゲーションの概念的な出発点です]
- VenueNameでPLAYSに参加する
- bandNameでBANDに参加して、bandCountryを取得します
- バンド名は気にしません。VenueNameとbandCountryのみを選択します
- 冗長なbandCountriesは気にしません。DISTRICTまたはGROUP BYを使用して重複を削除する
- 名前ではなく、個別のbandCountriesの数のみを考慮します
- 個別のbandCountriesのカウントがbandCountriesの総数と同じ会場のみが必要です
上記の解決策(またはその合理的な複製)に戻る
概要
- 集合論
- リレーショナルナビゲーションパス
- 包括的基準と排他的基準(適格か不適格か)