-1

問題は次のとおりです。

fan(fanID: integer, fanName: string)
band(bandID: integer, bandName: string)
likes(fanID: integer, bandID: integer)
bandMember(memID: integer, memName: string, bandID: integer, nationality: string)

(a) メンバーがイギリス人のみのバンドの名前を挙げてください。

最初は、この解決策を思いついたと思いました:

Select bandname
from band
where band.id NOT IN
    (select bandMember.id
     from bandMember
     where nationality <> 'British')

でも、イギリス人のメンバーが少なくとも 1 人しかいないバンドをどうやって選んだのか考えていました。必ずしも全員が英国人というわけではありません。誰かが特定のバンドのすべてのメンバーを検索して、全員がイギリス人かどうかを確認するクエリを実行する方法を考えてくれませんか??

4

2 に答える 2

3

メンバーにバンドに参加しますが、英国人以外のメンバーのみです。これを OUTER JOIN で行います。結合条件で国籍を指定することが重要です。一致するものがない場合、外部結合は bandMember のすべての列を null として返します。

SELECT b.bandname
FROM band b
LEFT OUTER JOIN bandMember m
 ON b.bandID = m.bandID AND m.nationality <> 'British'
WHERE m.bandID IS NULL

あなたのコメントについて:

上記のクエリは、次のクエリと同等である必要があります。

SELECT b.bandname
FROM band b
WHERE b.bandID NOT IN 
  (SELECT bandID FROM bandMember WHERE nationality <> 'British')

それはあなたの当初の考えとは少し異なりますが、私は と比較bandIdしていbandIdます。

JOINしかし、SQL での使用に慣れる必要があります。なしで SQL でプログラミングしようとすることJOINは、他のほとんどの言語で なしでプログラミングしようとするようなものwhileです。これは SQL 言語の基本的な部分であるだけでなく、多くの場合、パフォーマンスが向上します。YMMV; データに対して両方のソリューションをテストします。

于 2013-07-16T22:34:34.787 に答える
0

を使った解決方法をご紹介しますgroup by。「set-within-a-set」サブクエリにはgroup byandを使用することを好みます。having

select b.bandname
from band b join
     bandmember bm
     on b.id = bm.bandid
group by b.bandname
having sum(case when bm.nationality <> 'British' then 1 else 0 end) = 0;

このソリューションの優れている点は、非常に簡単に適応できることです。英国人メンバーが少なくとも 2 人いるバンドが必要だとします。

having sum(case when bm.nationality = 'British' then 1 else 0 end) >= 2;

ちなみに、 と比較band.idしているため、クエリはまったく機能しないはずですbandMember.id。内部選択は である必要がありますbandId

于 2013-07-16T23:28:32.347 に答える