2013-03-14 40 views
1

我一直在做一個家庭作業約一週的時間,而且我碰到了一堵牆。我幾乎100%肯定我需要使用NOT EXIST語句,但是我不能在我的生活中讓我的頭腦圍繞嵌套這些語句。我敢肯定,我只是把問題變得比需要的更難,但在這裏。在mySQL中不存在

我寫的3個創建表語句如下。

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。任何幫助將非常感激。我想我需要一本不存在的書籍和副本聲明,然後是副本和圖書館的聲明,但我完全失去了。

+0

請把你也試過的查詢。 – hjpotter92 2013-03-14 22:10:02

+0

我試過各種組合,但不幸的是沒有任何工作,我的教授通常使用NOT EXISTS做這種事情的東西,所以我只是假設這就是他在這裏想要的=/ – 2013-03-14 22:29:58

回答

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 Fiddle Demo

編輯 - 我更新了上面的查詢中,你不得不情況下,使用重複計數複製表中有多個記錄。希望這可以幫助。

+0

我認爲我更理解第二個版本,然後更好第一個,但是當我嘗試它時,它增加了一個沒有每本書副本的庫。我會盡力修復它。我從來沒有想過嘗試使用內部連接並將它全部變成一個表格。 – 2013-03-14 22:29:07

+0

@AndrewCooper - 如果您用一些「真實」數據更新SQL小提琴,我很樂意與您一起來看看。該查詢應該只返回圖書計數=圖書數量的圖書館。如果您的副本表中有多個記錄,則可能需要將DISTINCT添加到查詢中。嘗試添加計數(不同的b.booknum),看看是否可以解決您的問題。祝你好運! – sgeddes 2013-03-14 22:32:50

+0

我剛來這裏發佈,它只是錯過了鮮明的=)謝謝你們這麼多推動我在正確的方向。這是我曾經參加過的任何論壇上最好的社區之一。總是非常有幫助。 – 2013-03-14 22:41:26