2011-09-23 39 views
3

假設您有兩個表。一個叫電影:使用SQL查詢查找至少有一個指定值的行

  • MovieId
  • 的movieName

然後又稱爲行爲者包括誰出現在那些電影人:

  • MovieId
  • ActorName

現在,我想編寫一個查詢,返回任何包含以下演員的電影:「湯姆漢克斯」,「羅素克洛」或「阿諾德施瓦辛格」。

一種方式做到這一點會是這樣的:

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表成爲我從中選擇的主表。

什麼是最好的查詢方法?如果有問題,我正在使用Oracle 11g,但我希望使用標準的SQL方法。

+0

如果您要顯示您正在選擇的實際表格,將有所幫助... –

回答

12

您可以使用EXISTSIN子查詢:

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

太棒了!我實際上有點尷尬,我沒有想到這個我自己,我想我不能空腹編碼。 –

+0

上述SQL將不起作用。文字文字必須用下面的單引號括起來:''Tom Hanks'' –

+0

是的。我複製了初始條件:-)謝謝。 –

2

首先,你應該有3臺實現多對多關係:

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) 
); 

然後你選擇像這樣:

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'); 

請注意,文字文字包含在單引號

+1

'DISTINCT'代價高昂。如果可能,最好避免使用「DISTINCT」。 –

+0

在這裏您可以在「DISTINCT」,「GROUP BY」和「WHERE m.MovieId IN(子選擇)」之間進行選擇。運行測試以查看哪個更快。我只用幾千行對PostgreSQL v9.0(不是Oracle!)進行了測試,並且所有三個變體大約在同一時間。它非常依賴於細節。也許波格丹用SQL-Server的經驗說話?每個RDBMS的表現都不相同。 –

+0

每個RDBMS是不同的。我同意。一些RDBMS可以有比其他更好的QueryOptimizer。或不。從[這裏]請參閱第4項(http://stackoverflow.com/questions/621884/database-development-mistakes-made-by-application-developers/621891#621891)。 –

相關問題