我是sql查询的新手。我正在编写一个查询,我想在其中返回标题
到目前为止,我有以下查询,但它确实有效,但它没有返回正确的结果。 如果有人可以指导我在哪里出错。
SELECT movie_title, release_year
FROM (
SELECT m.movie_title, m.release_year,COUNT(n.won),
COUNT(c.actor_name)
FROM MOVIE m JOIN ON (n.movie_title=m.movie_title AND n.release_year=m.release_year)
JOIN on (c.movie_title=m.movie_title AND c.release_year=m.release_year)
GROUP BY m.movie_title, m.release_year
HAVING COUNT(n.won)>2 OR COUNT(c.actor_name)>2
);
我在线查看了一些示例,但未能得到确切的结果。
感谢您的帮助。
答案 0 :(得分:3)
将您的病情改为;
HAVING ( COUNT(n.won) > 1 AND COUNT(c.actor_name) < 2 )
OR ( COUNT(n.won) < 2 AND COUNT(c.actor_name) > 1 )
或使用前一张海报所提及的更简洁的XOR;
HAVING COUNT(n.won) > 1 XOR COUNT(c.actor_name) > 1
答案 1 :(得分:1)
大多数数据库系统都有XOR
运算符,这正是您想要的行为。
如果任一操作数为NULL
,则[XOR]返回
NULL
。对于非NULL
个操作数,如果奇数个操作数非零,则求值为1
,否则返回0
。
XOR
:如果任一组件条件为TRUE
,则返回TRUE
。如果两者都是FALSE
,则返回FALSE
。否则返回UNKNOWN
。
从数学的角度来看,XOR代表eXclusive OR;字面意思是&#34;一个或另一个,但不是两个&#34;。有趣的是,它在逻辑上等同于NOT AND
,因此您可以有效地使用它。
答案 2 :(得分:1)
另一种方法是通过union和另一组来:
select * from (select movie_title, release_year from movie m
JOIN CAST_MEMBER c on (c.movie_title=m.movie_title AND c.release_year=m.release_year)
group by m.movie_title, m.release_year
having count(*)>1) cm
union all
select * from (select movie_title, release_year from movie m
JOIN NOMINATION n on (n.movie_title=m.movie_title AND n.release_year=m.release_year)
group by m.movie_title, m.release_year
having count(*)>1) nm
group by movie_title, release_year
having count(*) = 1