假设我们有 clients
以及 providers
. 一个客户可以有多个供应商(如互联网,电话,电视等),我想找到客户的名字谁有多个供应商。
create table clients
(
client_id char(8) not null,
client_name varchar(80) not null,
contract char(1) not null,
primary key (client_id)
)
create table client_provider
(
provider_id char(11) not null,
client_id char(8) not null,
primary key (provider_id, client_id),
foreign key (provder_id) references providers ON DELETE CASCADE,
foreign key (client_id) references clients ON DELETE CASCADE
);
因此,即使不知道 providers
,我们可以通过下面的关系代数来了解具有多个提供者的客户(刚刚开始学习,如果我错了请纠正我):
π 客户名称(
[ σ 客户端\提供商2.提供商\ id≠ 客户端\提供商。提供商\ id∧ client\u provider2.client\u id=客户端\u提供者.client\u id(ρ 客户端提供程序2(客户端提供程序)⨯ 客户(提供商)
⨝ [客户]
到目前为止,我尝试了什么(在第1行返回“not a group by expression”:
SQL> select c.client_name
2 from clients c
3 inner join client_provider cp on c.client_id = cp.client_id
4 group by cp.client_id
5 having count(*) > 1;
2条答案
按热度按时间u3r8eeie1#
使用时
GROUP BY
所有使用的列都应在GROUP BY
或者在聚合函数中。要解决此问题,请执行以下操作:添加
cp.client_id
在SELECT
条款添加
c.client_name
在GROUP BY
条款cigdeys32#
所有非聚合列必须在
group by
现在你知道了。正如您所评论的,您只想显示
client_name
但不是client_id
(当它必须在group by
子句),将当前查询用作最终结果的源:或者,可以使用(稍微修改的)当前查询作为子查询: