2011-03-18 2 views
0

다음 표를 만들고 몇 개의 값을 삽입했습니다.제약 문제

create table books 
(bookid integer primary key, 
booktitle varchar(20), 
year integer, 
publisherid integer foreign key references publisher(publisherid), 
price integer, 
number integer) 

create table publisher 
(publisherid integer primary key, 
publishername varchar(20)) 

create table author 
(authorid integer primary key, 
authorname varchar(20)) 

create table bookauthor 
(bookid integer foreign key references books(bookid), 
authorid integer references author(authorid), 
earnings integer) 

create table bookreference 
(bookid integer foreign key references books(bookid), 
referencebook varchar(20), 
times integer) 

create table reviewer 
(reviewerid integer primary key, 
reviewername varchar(20)) 

create table bookreview 
(bookid integer foreign key references books(bookid), 
reviewerid integer foreign key references reviewer(reviewerid), 
score integer) 

는 지금, 나는 2000 년

이 모든 책이 모두 '잠머 Tulpule'와 '인 Hemant Mahta'

그래서 2003 년에 출판 검토 찾기 SQL Server의 다음 쿼리를 해결하려면 다음 쿼리를 실행했습니다.

SELECT B.booktitle 
FROM bookreview BR 
INNER JOIN books B ON BR.bookid = B.bookid 
INNER JOIN reviewer R ON R.reviewerid = BR.reviewerid 
WHERE 
    B.year=2003 
    AND R.reviewername IN('Sammer Tulphule','Hemant Mahta') 

그러나이 책에서 나는 2003 년에 출판하고 리뷰어 중 한 명이 리뷰 한 모든 책의 이름을 얻었다. 사실 저는 2003 년에 출판 된 모든 책의 이름을 원하고 둘 중 하나만 검토했습니다.

그럼 어떻게 쿼리를 수정할 수 있습니까?

감사합니다. & 안부, 푸우 자.

+0

bookreview 테이블에 PK가 없습니다. 리뷰어가 같은 책을 두 번 이상 검토 할 수 있습니까? –

답변

1

bookreview 및 bookreviewer 테이블에 두 번 참여해야합니다 (필요한 각 리뷰어마다 한 번씩). 이 작업을 달성하기 위해 서로 다른 테이블 별칭을 사용할 수 있습니다

select B.booktitle 
from books B 
where 
    B.year = 2003 and 
    exists (select 1 
    from bookreview BR 
     join reviewer R on BR.reviewerid = R.reviewerid 
    where BR.bookid = B.bookid and 
     R.reviewername = 'Sammer Tulphule') and 
    exists (select 1 
    from bookreview BR 
     join reviewer R on BR.reviewerid = R.reviewerid 
    where BR.bookid = B.bookid and 
     R.reviewername = 'Hemant Mahta') 

쉽게 이해할 수 있습니다 :이 절을 존재와 함께 당신은 또한이 작업을 수행 할 수

select B.booktitle 
from books B 
    join bookreview BR1 on B.bookid = BR1.bookid 
    join reviewer R1 on R1.reviewerid = BR1.reviewerid 
    join bookreview BR2 on B.bookid = BR2.bookid 
    join reviewer R2 on R2.reviewerid = BR2.reviewerid 
where B.year = 2003 and 
    R1.reviewername = 'Sammer Tulphule' and 
    R2.reviewername = 'Hemant Mahta' 

.

1

검색어를 조금 더 확장하십시오. 이 쿼리는 자체 조인 또는 존재 (상관 하위 쿼리)를 사용하는 것보다 빠르며 한 번만 테이블을 통과합니다.

SELECT B.booktitle 
FROM bookreview BR 
INNER JOIN books B ON BR.bookid = B.bookid 
INNER JOIN reviewer R ON R.reviewerid = BR.reviewerid 
WHERE 
    B.year=2003 
    AND R.reviewername IN('Sammer Tulphule','Hemant Mahta') 
GROUP BY B.booktitle 
HAVING COUNT(distinct R.reviewername) = 2