SQL-запрос для поиска строк хотя бы с одним из указанных значений - PullRequest
3 голосов
/ 23 сентября 2011

Предположим, у вас было две таблицы. Один называется ФИЛЬМЫ:

  • MovieId
  • MovieName

Затем еще один по имени ACTORS, в котором есть люди, которые появляются в этих фильмах:

  • 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.

Ответы [ 2 ]

12 голосов
/ 23 сентября 2011

Вы можете использовать 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')
)
2 голосов
/ 23 сентября 2011

Сначала у вас должна быть третья таблица, реализующая отношение n: m:

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

Обратите внимание, что текстовые литералы заключены в одинарные кавычки !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...