2

私はこれらのテーブルを持っています:

  • 映画(mID、タイトル、年、監督)
  • レビュアー(rID、name)
  • 評価(rID、mID、星、ratingDate)

といくつかのビュー:

  • ビューLateRatingには、2011年1月20日以降の映画の評価が含まれます。ビューには、映画ID、映画のタイトル、星の数、および評価日が含まれます。

    create view LateRating as 
      select distinct R.mID, title, stars, ratingDate 
      from Rating R, Movie M 
      where R.mID = M.mID 
      and ratingDate > '2011-01-20' 
    
  • ビューHighlyRatedには、3つ星を超える評価が少なくとも1つある映画が含まれています。ビューには、映画IDと映画タイトルが含まれています。

    create view HighlyRated as 
      select mID, title 
      from Movie 
      where mID in (select mID from Rating where stars > 3) 
    
  • ビューNoRatingには、データベースに評価のない映画が含まれています。ビューには、映画IDと映画タイトルが含まれています。

    create view NoRating as 
      select mID, title 
      from Movie 
      where mID not in (select mID from Rating)  
    

これが私のデータセットです:https ://prod-c2g.s3.amazonaws.com/db/Winter2013/files/viewmovie.sql

ビューLateRatingのstars属性の更新を可能にする代わりのトリガーを作成するように求められます。これが私のアプローチです。

CREATE trigger update_LateRating_title INSTEAD OF 
UPDATE OF stars ON LateRating
BEGIN
  UPDATE Rating SET stars = stars - 2 
  WHERE Rating.mID = old.mID 
  AND Rating.mID IN (SELECT stars FROM Rating WHERE stars > 2);
END;

それはほぼ正しい答えを与えますが、201 101 4 2011-01-27.4であるべきであるという間違った行が1つだけあります。2。何が問題なのですか?

4

1 に答える 1

1

あなたのWHERE状態を見てみましょう:

...AND Rating.mID IN (SELECT stars FROM Rating WHERE stars > 2)

それは、評価から選択されたRating.mID値の中にあるべきであると述べています。starsここで何が意図されていたのかわかりません。テーブルのその行のの星の数がより大きい場合、星を変更しようとする試みのために星の数を2減らしたいと仮定しましょう(これは奇妙です:星を増やすクエリをいくつかの無関係なクエリに変えています)2.2。Rating

CREATE trigger update_LateRating_stars INSTEAD OF 
UPDATE OF stars ON LateRating
BEGIN
  UPDATE Rating SET stars = stars - 2 
  WHERE Rating.mID = old.mID 
  AND Rating.stars > 2;
END;

繰り返しになりますが、あなたが望むものには多くの可能な解釈があり、それらはすべて多かれ少なかれ奇妙です:mIDフィールドインLateRatingは元のレコードを識別するのに十分ではありません( Rating同じレビューアに同じ映画で同時に異なる意見を持っている)。rIDmID

于 2013-01-27T17:44:27.157 に答える