![](/img/trans.png)
[英]SQL server query to find values grouped by one column but different in at least one of other columns
[英]SQL query to find rows with at least one of the specified values
假設你有兩張桌子。 一個叫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方法。
您可以使用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')
)
首先,您應該有一個實現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.