假设你有两张桌子。一个叫MOVIES:
然后另一个名为ACTORS的人包含出现在这些电影中的人:
现在,我想编写一个查询,返回包含以下演员中的一个或多个的电影:“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表成为我选择的主表。
查询此问题的最佳方法是什么?如果重要的话,我正在使用Oracle 11g,但我希望有一种标准的SQL方法。
答案 0 :(得分:12)
您可以使用EXISTS
或IN
子查询:
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')
)
答案 1 :(得分:2)
首先,您应该有一个实现n:m关系的第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');
请注意,文字文字包含在单引号!
中