我有两个查询,第一个返回一个电影,一年有电影,有两个以上的演员,第二个查询显示已经赢得两个以上奖项的电影。
所以我想写一个查询,它会给我一个查询但不是两个查询的电影和年份。我怎么能这样做?
语法在Oracle中。
答案 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
条件的一部分。