电影和年份存在于一个查询中但不存在于两者中

时间:2014-10-18 02:05:14

标签: sql oracle10g exists

我有两个查询,第一个返回一个电影,一年有电影,有两个以上的演员,第二个查询显示已经赢得两个以上奖项的电影。

所以我想写一个查询,它会给我一个查询但不是两个查询的电影和年份。我怎么能这样做?

语法在Oracle中。

3 个答案:

答案 0 :(得分:2)

我们可以做到这一点

第一组是仅存在于table1中的行

第二组是仅存在于table2上的行

 SELECT * FROM table1
 MINUS
 SELECT * FROM table2

 UNION

 SELECT * FROM table2
 MINUS
 SELECT * FROM table1

答案 1 :(得分:1)

  

我想写一个查询,它会给我电影和年份   发生在一个查询中,但不是两个。

要执行此操作,您需要同时UNION查询和INTERCEPT两个查询以及MINUS INTERCEPT来自UNION。喜欢这个

((SELECT T2.movie_title,T2.release_year
FROM(SELECT b.movie_title,b.release_year, COUNT(b.movie_title) as NUMMOVIES
FROM ACTOR a FULL OUTER JOIN CAST_MEMBER b ON a.actor_name=b.actor_name
WHERE EXISTS(SELECT c.actor_name FROM CAST_MEMBER c WHERE c.actor_name=a.actor_name)
GROUP BY b.movie_title,b.release_year) T2
WHERE T2.NUMMOVIES > 2) 

UNION

(SELECT a.movie_title,a.release_year
FROM MOVIE a
WHERE (SELECT COUNT(b.won) as Won_Counter
            FROM NOMINATION b
            WHERE b.movie_title=a.movie_title AND a.release_year=b.release_year AND b.won ='Yes') > 2))

MINUS

((SELECT T2.movie_title,T2.release_year
FROM(SELECT b.movie_title,b.release_year, COUNT(b.movie_title) as NUMMOVIES
FROM ACTOR a FULL OUTER JOIN CAST_MEMBER b ON a.actor_name=b.actor_name
WHERE EXISTS(SELECT c.actor_name FROM CAST_MEMBER c WHERE c.actor_name=a.actor_name)
GROUP BY b.movie_title,b.release_year) T2
WHERE T2.NUMMOVIES > 2) 

INTERSECT 

(SELECT a.movie_title,a.release_year
FROM MOVIE a
WHERE (SELECT COUNT(b.won) as Won_Counter
            FROM NOMINATION b
            WHERE b.movie_title=a.movie_title AND a.release_year=b.release_year AND b.won ='Yes') > 2))

详细了解这些运营商here

我确信有更好的方法可以做到这一点,但我们需要有关您的表格的更多信息

答案 2 :(得分:1)

您可以通过多种方式完成此操作。这是一种不使用minus的方式:

with q1 as (
      <first query here>
     ),
     q2 as (
      <second query here>
     )
select q1.*
from q1
where not exists (select 1 from q2 where q2.movie = q1.movie);

这假定您希望第一个查询中的电影不在第二个查询中。它还假设第二个不会返回一年;否则这将成为where条件的一部分。