2013-03-14 4 views
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) 
); 

내가 쓰려고하는 쿼리는 모든 책의 복사본이 들어있는 라이브러리의 라이브러리 이름을 반환해야합니다. 어떤 도움이라도 대단히 감사 할 것입니다. 나는 책과 사본을 위해 존재하지 않는 진술이 필요하다고 생각하고 사본과 도서관을 위해 또 다른 진술을 필요로한다고 생각하지만 나는 완전히 잃어버린 다.

+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

편집 - 당신이 한 경우에 고유 한 카운트를 사용하는 위의 쿼리를 업데이트 복사본 테이블에 여러 레코드가 있습니다. 희망이 도움이됩니다.

+0

나는 두 번째 버전을 더 잘 이해한다고 생각합니다. 첫 번째로, 시도 할 때 모든 책의 복사본이없는 라이브러리가 추가됩니다. 나는 그것을 고치려고 노력할 것이다. 내부 조인을 시도하고 사용하여 하나의 테이블로 변환하는 일은 절대로 발생하지 않았습니다. –

+0

@AndrewCooper - "실제"데이터로 SQL Fiddle을 업데이트하면 기꺼이 살펴볼 것입니다. 이 쿼리는 장부 개수 = 장수의 라이브러리 만 반환해야합니다. 복사본 테이블에 레코드가 여러 개있는 경우 쿼리에 DISTINCT를 추가해야 할 수도 있습니다. count (distinct b.booknum)를 추가하고 문제가 해결되는지 확인해보십시오. 행운을 빌어 요! – sgeddes

+0

나는 방금 그것이 뚜렷한 =를 놓치고 있었다라고 게시하기 위해 여기에왔다. 이것은 진지하게 내가 만난 모든 포럼에서 최고의 커뮤니티 중 하나입니다. 항상 도움이됩니다. –

관련 문제