【问题标题】:SQL Condition to get "a" or "b" but not both获取“a”或“b”但不能同时获取的 SQL 条件
【发布时间】:2014-12-24 15:44:13
【问题描述】:

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

我在网上查看了示例,但无法得到确切的结果。

感谢大家的帮助。

【问题讨论】:

  • 为什么要从FROM 子句中删除这两个表?查询现在无效(JOIN 之后缺少表)。

标签: mysql sql oracle11g


【解决方案1】:

将你的条件改为;

HAVING ( COUNT(n.won) > 1 AND COUNT(c.actor_name) < 2 )
         OR ( COUNT(n.won) < 2 AND COUNT(c.actor_name) > 1 ) 

或者使用之前海报中提到的更简洁的异或;

HAVING COUNT(n.won) > 1 XOR COUNT(c.actor_name) > 1 

【讨论】:

  • 感谢您的回复。这对我来说更有意义,但只是一个后续问题。不应该 COUNT(n.won)>2 吗?如果你能解释一下。感谢您的帮助
  • 您要求 2 个或更多,您可以改用 COUNT(n.won) &gt;= 2,但我更喜欢简洁的版本 COUNT(n.won) &gt; 1,它本质上是一样的。你最初得到的只会大于 2,即 3 及以上。
【解决方案2】:

大多数数据库系统都有XOR 运算符,这正是您想要的行为。

来自MySQL documentation

[XOR] 如果任一操作数是NULL,则返回NULL。对于非NULL 操作数,如果奇数个操作数非零,则计算结果为1,否则返回0

来自Oracle 11g documentation

XOR:如果任一组件条件为TRUE,则返回TRUE。如果两者都是 FALSE,则返回 FALSE。否则返回UNKNOWN

从数学的角度来看,XOR 代表异或;它的字面意思是“一个或另一个,但不是两者”。有趣的是,它在逻辑上等同于 NOT AND,因此您可以同样有效地使用它。

【讨论】:

  • 没想到异或运算。但是,是的,这也有效。谢谢。
【解决方案3】:

另一种方法是通过 union 和另一个 group by:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2021-08-19
    相关资源
    最近更新 更多