2013-03-14 2 views
1

내 데이터베이스 클래스에 대한 라이브러리 그룹에 대한 데이터베이스를 만드는 프로젝트가 있습니다. 나는 MySQL 5.2를 사용하고있다. 모든 책의 사본을 보관하는 두 개의 라이브러리를 찾으려면 쿼리를 작성해야합니다. 이 테이블 문 제가유니버설 quatifier in SQL

SELECT libname FROM libraries WHERE NOT EXISTS 
(SELECT * FROM copies C, books B WHERE C.booknum=B.booknum) 

같은 뭔가가 필요하지만 그렇지 않은 이잖아 생각

Create table books( 
    booknum VARCHAR (10), 
    btitle VARCHAR(), 
    bpages SMALLINT, 
    bcdate DATE, 
    primary key (booknum)) 

Create table copies( 
    cnum VARCHAR(12), 
    cprice DECIMAL (7,2), 
    cpurdate DATE, 
    booknum VARCHAR(10), 
    primary key (cnum), 
    foreign key (booknum) 
    references book(booknum)) 

Create table library( 
    libnum VARCHAR(7), 
    libname VARCHAR (40), 
    streetNumber VARCHAR (8), 
    streetName VARCHAR (20), 
    city VARCHAR (20), 
    state VARCHAR (2), 
    zipcode VARCHAR (5), 
    primary key (libnum)) 

을 만들 수있는?

+4

사이드 노트 - 어떤 이유로, 모든 SQL 초보자는 서브 쿼리로 모든 것을 해결하기 위해 시도합니다. 제 충고는'JOIN' 운영자 가족을 사용하고 사랑하는 법을 배웁니다. –

+0

'library'와'copies'가 어떻게 연결되는지 모르겠습니다. BTW는 포함 된 엔티티에 대해 단 하나의 명사를 사용하여 모든 기본 테이블을 호출하는 습관이 좋으며, 복수형을 사용하는 것이 더 나쁘지 만 복수 형과 단수 형을 갖는 것은 좋지 않습니다. – 9000

+0

@ ÁlvaroG.Vicario : 하위 쿼리가 나쁜 것은 아닙니다. 그리고 JOIN은 일반적으로 하위 쿼리의 드롭 인 대체가 아닙니다. 그리고 괜찮은 쿼리 옵티마이 저는 쿼리를 가장 효율적이고 동등한 조건으로 다시 작성합니다. –

답변

0

데이터베이스 디자인이 완전하지 않습니다. 복사본과 라이브러리 간의 다 대다 관계를 정의하는 다른 테이블을 추가해야합니다. 당신이 복사 테이블 라이브러리에서 외래 키를 추가하여 테이블을 업데이트 한 후

+0

또는 최소한 라이브러리를 참조하는 복사본에 필드를 추가하십시오. 카피 테이블은 책과 라이브러리 간의 다 대다 관계를 정의하는 테이블 인 것 같습니다. –

0

...

SELECT b.btitle, l.libname from copies c left join books b on b.booknum = c.booknum 
    left join l.libnum = c.libnum