Oracle SQL数据库管理系统

bakd9h0s  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(104)

免责声明:这是一个纯粹的理论问题,因为我有一个正确的工作代码。
你好,我是
我有一个简单的问题,但我猜答案不会简单。我试图用这个代码来实现的是获得所有发送者ID和所有消息的消息ID,这些消息是由我们至少收到两条消息的发送者发送的。
这是正确的工作代码:

select msg_id, sender_id
from messages
where sender_id in(
select sender_id
from messages
group by sender_id
having count(sender_id)>1);

我的问题是为什么下面的代码不能做。它返回一个没有数据的空表。我的意思是,group by和having的内部工作原理是什么,阻止了下面的代码工作。如果需要的话,你可以达到关系演算的水平。

select sender_id, msg_id from messages
group by sender_id, msg_id
having count(sender_id) > 1;

最后一件需要考虑的事情是,这显然是有效的:

select sender_id from messages
group by sender_id
having count(sender_id) > 1;

那为什么多加一列就会破坏结果呢?

6vl6ewon

6vl6ewon1#

一个简单的解决方案(不涉及自连接)是使用解析COUNT函数和内联视图:

SELECT msg_id, sender_id
FROM   (
  SELECT msg_id, sender_id, COUNT(*) OVER (PARTITION BY sender_id) AS num_senders
  FROM   messages
)
WHERE  num_senders > 1;

我的问题是为什么下面的代码不能做。[...]

select sender_id, msg_id from messages
group by sender_id, msg_id
having count(sender_id) > 1;

GROUP BYsender_idmsg_id,所以如果每个组只有一行(即,因为msg_id是唯一的,或者每个msg_idsender_id元组都是唯一的),那么将永远不会满足HAVING过滤器,因此从输出中排除所有行。
最后一件需要考虑的事情是,这显然是有效的:

select sender_id from messages
group by sender_id
having count(sender_id) > 1;

是的,因为您没有按sender_idmsg_id进行分组;你只按sender_id分组,在该组中将有多个msg_id

相关问题