簡體   English   中英

SQL查詢以查找具有至少一個指定值的行

[英]SQL query to find rows with at least one of the specified values

假設你有兩張桌子。 一個叫MOVIES:

  • MovieId
  • 電影名稱

然后是另一個名為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方法。

您可以使用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')
)

首先,您應該有一個實現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');

請注意,文本文字用單引號括起來

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM