SQL查询以查找具有至少一个指定值的行

时间:2011-09-23 19:34:35

标签: sql database oracle

假设你有两张桌子。一个叫MOVIES:

  • MovieId
  • 的movieName

然后另一个名为ACTORS的人包含出现在这些电影中的人:

  • 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表成为我选择的主表。

查询此问题的最佳方法是什么?如果重要的话,我正在使用Oracle 11g,但我希望有一种标准的SQL方法。

2 个答案:

答案 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')
)

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

请注意,文字文字包含在单引号