2013-03-14 3 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

+0

Ive пробовал всевозможные комбинации, и, к сожалению, ни один из них не работал, мой профессор обычно делает вещи, используя НЕ СУЩЕСТВУЮЩИЕ для таких вещей, поэтому я просто сделал предположение, что это то, что он хотел здесь также =/ –

ответ

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

EDIT - я обновил вышеуказанные запросы использовать DISTINCT количество в случае, если было несколько записей в вашей таблице копий. Надеюсь это поможет.

+0

Я думаю, что я понимаю вторую версию лучше, чем первый, но когда я пытаюсь, он добавляет библиотеку, у которой нет копии каждой книги. Однако я попытаюсь исправить это. Мне никогда не приходило в голову попробовать и использовать внутреннее соединение и превратить все это в один стол. –

+0

@AndrewCooper - если вы обновите SQL-скрипт некоторыми вашими «настоящими» данными, я с удовольствием посмотрю на него с вами. Этот запрос должен возвращать только библиотеки, чья книга count = количество книг. Возможно, вам придется добавить DISTINCT к вашему запросу, если в вашей таблице копий есть несколько записей. Попробуйте добавить счетчик (отдельный b.booknum) и посмотреть, устраняет ли это вашу проблему. Удачи! – sgeddes

+0

Я только что пришел сюда, чтобы написать, что просто не хватает четких =) Благодарю вас, ребята, за то, что вы толкали меня в правильном направлении. Это серьезно одно из лучших сообществ на любом форуме, на котором я когда-либо был. Всегда очень полезно. –

Смежные вопросы