【问题标题】:SQL query to find rows with at least one of the specified valuesSQL 查询以查找具有至少一个指定值的行
【发布时间】:2011-11-23 22:31:06
【问题描述】:

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

  • 电影 ID
  • 电影名

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

  • 电影 ID
  • 演员姓名

现在,我想编写一个查询,返回包含以下一个或多个演员的任何电影:“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 方法。

【问题讨论】:

  • 如果您能显示您从中选择的实际表格会有帮助...

标签: sql database oracle


【解决方案1】:

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

【讨论】:

  • 太棒了!我真的有点尴尬我自己没有想到这个,我想我不能空着肚子写代码。
  • 上面的SQL不行。文本文字必须用单引号括起来,如下所示:'Tom Hanks'
  • 是的。我复制了初始条件:-) 谢谢。
【解决方案2】:

首先你应该有一个实现 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');

注意,文本字面量用单引号括起来!

【讨论】:

  • DISTINCT 成本很高。如果可能,最好避免使用DISTINCT。
  • 这里您可以在DISTINCT、GROUP BY 和WHERE m.MovieId IN (subselect) 之间进行选择。运行测试看看哪个更快。我刚刚在 PostgreSQL v9.0(不是 Oracle!)上运行了几千行的测试,所有三个变体都花费了大约相同的时间。这在很大程度上取决于细节。也许 Bogdan 是根据 SQL-Server 的经验说话的?每个 RDBMS 的表现都不同。
  • 每个 RDBMS 都不同。我同意。一些 RDBMS 可以拥有比其他 RDBMS 更好的 QueryOptimizer。或不。请参阅here 中的第 4 项。
猜你喜欢
  • 1970-01-01
  • 2013-03-07
  • 2018-09-17
  • 2022-01-16
  • 1970-01-01
  • 2021-07-07
  • 2016-01-10
  • 2016-05-21
  • 1970-01-01
相关资源
最近更新 更多