-1

データセットは次のとおりです。

映画(mID、タイトル、年、監督) 英語:ID番号mID、タイトル、公開年、監督の映画があります。

レビュアー(rID、名前) 英語:ID番号rIDのレビュアーはある名前を持っています。

評価 (rID、mID、星、ratingDate) 英語: レビュアー rID は、特定の ratingDate で映画 mID に星の数 (1 ~ 5) の評価を与えました。

問題は次のとおりです。レーティングのないすべての映画のタイトルを見つけてください。

私の答え: (空のセットを返します)

select title from movie,rating where movie.mid=rating.mid and stars is null

正解:

 select title
 from movie 
 left join rating using (mID)
 where stars is null

参加の何が問題なのかわからないのですか? 前もって感謝します!

4

2 に答える 2

1

映画と評価の間で完全な相互結合を行います。つまり、最初は結果セットに考えられるすべての組み合わせ (映画、評価) が含まれています。

が必要ですmovie.mid = rating.mid。これにより、結果セットが、ペアになっている映画の実際の評価である (映画、評価) ペアのみに制限されます。

しかし、評価のない映画を想像してみてください。評価表には決して現れmovie.mid = rating.midないので、真になることもありません。これは真ではないため、レーティングのないすべての映画は、その where 句によって結果セットから削除されます。

正解は を使用しleft joinます。結合は、映画のすべての行と評価のすべての行が結合条件 (この場合mIDは等しい必要があります) に一致するものと一致します。これまでのところ、これはあなたが書いたものと意味的に同じです。しかし、その後、重要な役割を果たします。これは、評価に結合条件を通過する行がない映画の行について、評価テーブルの列のすべての値を含む映画の行がとにかく (1 回) 含まれることleftを意味します。条件は、エフェクトによって生成された行のみを取得します。(評価テーブルで を null にすることが許可されていない場合にのみ、where 句が正しく機能することに注意してください。)NULLstars is nullleftstars

于 2013-08-12T00:14:48.830 に答える