2011-09-23 3 views
3

두 개의 테이블이 있다고 가정합니다. 하나라는 무비 :지정된 값 중 하나 이상이있는 행을 찾으려면 SQL 쿼리

  • 그 영화에 나타나는 명 포함하는
  • 에서 moviename 그런

다른라는 배우를 MovieId :

  • 이 MovieId을
  • ActorName

이제 "Tom Hanks", "Russell Crowe"또는 "Arnold Schwarzenegger"중 한 명 이상이 포함 된 영화를 반환하는 쿼리를 작성하려고합니다.

한 가지 방법은이 같은 것 할 : 완벽하게 괜찮

SELECT DISTINCT A.MovieId, M.MovieName FROM ACTORS A 
INNER JOIN MOVIES M USING (MovieId) 
WHERE A.ActorName IN ('Tom Hanks', 'Russell Crowe', 'Arnold Schwarzenegger'); 

그러나 내 경우에는 내가 내가 할 수있는 방법을 찾으려는 WHERE 절에 이러한 조건의 몇 가지 더있을 수 있습니다 MOVIES 테이블을 내가 선택한 1 차 테이블로 만듭니다.

이 질문을하는 가장 좋은 방법은 무엇입니까? 필자는 Oracle 11g를 사용하고 있지만 표준 SQL 메소드가 필요합니다. 그럼 당신을

CREATE TABLE movie (
movie_id int primary key 
,moviename text 
-- more fields 
); 

CREATE TABLE actor (
actor_id int primary key 
,actorname text 
-- more fields 
); 

CREATE TABLE movieactor (
movie_id int references movie(movie_id) 
,actor_id int references actor(actor_id) 
,CONSTRAINT movieactor_pkey PRIMARY KEY (movie_id, actor_id) 
); 

: m 관계 : 당신이 3 테이블 N 구현을 가져야한다

SELECT * 
FROM MOVIES m 
WHERE EXISTS 
(
    SELECT * 
    FROM ACTORS a 
    WHERE a.MovieId = m.MovieId 
    AND a.ActorName IN ('Tom Hanks', 'Russell Crowe', 'Arnold Schwarzenegger') 
) 

또는

SELECT * 
FROM MOVIES m 
WHERE m.MovieId IN 
(
    SELECT a.MovieId 
    FROM ACTORS a 
    WHERE a.ActorName IN ('Tom Hanks', 'Russell Crowe', 'Arnold Schwarzenegger') 
) 
+0

선택할 실제 테이블을 표시하려면 도움이 될 것입니다 ... –

답변

12

당신은 EXISTS 또는 IN 하위 쿼리를 사용할 수 있습니다 다음과 같이 선택하십시오 :

SELECT DISTINCT m.movie_id, m.moviename 
    FROM movie m 
    JOIN movieactor ma USING (movie_id) 
    JOIN actor a USING (actor_id) 
WHERE a.actorname IN ('Tom Hanks', 'Russell Crowe', 'Arnold Schwarzenegger'); 

텍스트 리터럴은 작은 따옴표로 묶습니다.!

+0

굉장! 나는 실제로 나 자신이 생각하지 않았던 다소 당황 스럽다. 나는 빈속에 코드를 작성할 수 없다고 생각한다. –

+0

위의 SQL은 작동하지 않습니다. 텍스트 리터럴은 다음과 같이 작은 따옴표로 묶어야합니다.''Tom Hanks'' –

+0

예. 나는 초기 조건을 복사 :-) 고마워. –

2

첫째 :

+1

'DISTINCT '는 비용이 많이 든다. 가능한 경우 DISTINCT를 피하는 것이 좋습니다. –

+0

여기서'DISTINCT','GROUP BY'와'WHERE m.MovieId IN (subselect)'중에서 선택할 수 있습니다. 어떤 테스트가 더 빠르는지 테스트 해보십시오. PostgreSQL v9.0 (Oracle이 아닌)에서 수천 개의 행을 가진 테스트를 실행했으며 세 가지 변종 모두 거의 같은 시간이 걸렸습니다. 세부 사항에 크게 좌우됩니다. 어쩌면 Bogdan이 SQL Server에 대한 경험으로 말했 을까요? 각 RDBMS는 다르게 작동합니다. –

+0

각 RDBMS는 다릅니다. 나는 동의한다. 일부 RDBMS는 다른 것보다 더 나은 QueryOptimizer를 가질 수 있습니다. 아니. [here] (http://stackoverflow.com/questions/621884/database-development-mistakes-made-by-application-developers/621891#621891)의 4 번 항목을 참조하십시오. –

관련 문제