SQL条件得到" a"或" b"但不是两个

时间:2014-10-29 02:28:56

标签: mysql sql oracle11g

我是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
);

我在线查看了一些示例,但未能得到确切的结果。

感谢您的帮助。

3 个答案:

答案 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运算符,这正是您想要的行为。

来自MySQL documentation

  如果任一操作数为NULL,则

[XOR]返回NULL。对于非NULL个操作数,如果奇数个操作数非零,则求值为1,否则返回0

来自Oracle 11g documentation

  

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