1

我已经做了大约一个星期的家庭作业,但我碰壁了。我几乎 100% 确定我需要使用 NOT EXIST 语句,但我一辈子都无法理解这些语句的嵌套。我确定我只是让这个问题变得比它需要的更难,但它就在这里。

我写的3个create table语句如下。

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 有几种不同的方法可以做到这一点。这是使用子查询的一种方法:

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 回答