1

宿題を1週間ほどやっていて、壁にぶつかりました。NOT EXISTステートメントを使用する必要があることはほぼ100%確信していますが、私は一生の間、これらのステートメントのネストに頭を悩ませることはできません。質問を必要以上に難しくしていると確信していますが、ここで説明します。

私が書いた3つのcreatetableステートメントは次のとおりです。

create table libraries (
    Libnum varchar(7) primary key,
    Libname varchar(40),
    Streetnum varchar(8),
    Streetname varchar(20),
    City varchar(20),
    State varchar(2),
    Zip varchar(5)
);

create table books (
    Booknum varchar(10) primary key,
    Btitle varchar(50),
    Pages smallint unsigned,
    Copyright Date
);
create table copies (
    Copynum varchar(12) primary key,
    price decimal(7 , 2 ),
    Purchase Date,
    Booknum varchar(10) references books (Booknum),
    Libnum varchar(10) references libraries (Libnum)
);

私が書き込もうとしているクエリは、すべての本のコピーを格納しているライブラリのLibnameを返す必要があります。どんな助けでも大歓迎です。本とコピーには存在しないステートメントが必要だと思いますが、コピーとライブラリには別のステートメントが必要ですが、私は完全に迷子になっています。

4

1 に答える 1

0

MySQL でこれを行うには、いくつかの方法があります。サブクエリを使用したアプローチの 1 つを次に示します。

select libname
from (
  select l.libname, count(distinct b.booknum) cnt, bcount.cnt bookcount
  from (
      select count(1) cnt
      from books
      ) bcount, libraries l
    inner join copies c on l.libnum = c.libnum
    inner join books b on c.booknum = b.booknum  
  group by l.libnum
) t
where t.cnt = t.bookcount

そして、おそらくより良いわずかなバリエーション:

select l.libname
from libraries l
  inner join copies c on l.libnum = c.libnum
  inner join books b on c.booknum = b.booknum  
group by l.libnum
having count(distinct b.booknum) = (
  select count(1) cnt
  from books
)

SQL フィドルのデモ

編集 -- コピー テーブルに複数のレコードがある場合に備えて、DISTINCT カウントを使用するように上記のクエリを更新しました。お役に立てれば。

于 2013-03-14T22:16:50.563 に答える