2017-09-14 12 views
0

私はテーブル購入のsidに関連する名前とsidを持つstudentテーブルを持っています。買物はまた、テーブル引用(bookations)(引用)のbooknoに関連するbooknoフィールドを有する。 Citesには、ブックブックのbooknoに関連するcitedbooknoフィールドがあります。高値の書籍で引用された書籍を購入したすべての学生のためのクエリ

現在、私は書籍を購入したすべての生徒がいるだけですが、より高い価格で少なくとも1冊の書籍で引用された本を購入した生徒のみを見せたいと思っています。私はここでカウントクエリを書く方法を正確にはわかりません。どんな助けもありがとう。ありがとう!

SELECT DISTINCT s.sid, s.sname 
FROM student s 
WHERE s.sid IN (SELECT r.sid 
    FROM buys r 
    WHERE b.bookno IN (SELECT c.bookno 
       FROM cites c 
        WHERE c.citedbookno IN (SELECT b.bookno 
          FROM book b 
          WHERE b.bookno = c.citedbookno))); 
+2

テーブルには価格の列がありますか?あなたは私たちに完全な構造を見せてもらえますか? –

+1

サンプルテーブルのデータと予想される結果を、画像ではなく書式付きのテキストとして追加します。 – jarlh

答えて

0

シンプルバージョン:

select  distinct student.sid, student.sname 
from  student 
      inner join 
      buys 
      on buys.sid = student.sid 
      inner join 
      book 
      on book.bookno = buys.bookno 
      inner join 
      cites 
      on cites.citedbookno = book.bookno 
      inner join 
      book bookExpensive 
      on bookExpensive.bookno = cites.bookno 
where  bookExpensive.price > book.price 

は、これは同じですが、より良い実行することがあります:

select  student.sid, student.sname 
from  student 
where  exists(
       select  1 
       from  buys 
          inner join 
          book 
          on book.bookno = buys.bookno 
       where  buys.sid = student.sid 
          and 
          exists(
           select  1 
           from  cites 
              inner join 
              book bookExpensive 
              on bookExpensive.bookno = cites.bookno 
           where  cites.citedbookno = book.bookno 
              and 
              bookExpensive.price > book.price 
          ) 
      ) 
0

cites.citedbooknoが引用されている書籍のbooknoであると仮定します。

SELECT 
    s.sid, 
    s.sname 
FROM Student s 
WHERE s.sid IN (
        SELECT r.sid 
        FROM buys r 
        JOIN cites c ON r.bookno = c.citedbookno 
       ); 
関連する問題