假设我们有 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
,我们可以通过下面的关系代数知道有多个提供者的客户(刚开始学习,如果我错了,请指正)。
π client_name (
[σ client_provider2.provider_id ≠ client_provider.provider_id ∧ client_provider2.client_id = client_provider.client_id (ρ client_provider2 (client_provider) ⨯ client_provider))
⨝客户端]
到目前为止,我所做的尝试(在第1行返回 "不是GROUP BY表达式")。
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;
当使用 GROUP BY
所有使用的列都应该是在 GROUP BY
或在一个集合函数中。要解决这个问题,请执行以下操作。
cp.client_id
在 SELECT
条款c.client_name
在 GROUP BY
条款SELECT
cp.client_id,
c.client_name
FROM clients c
INNER JOIN client_provider cp
ON c.client_id = cp.client_id
GROUP BY
cp.client_id,
c.client_name
HAVING
COUNT(1) > 1
所有非合计栏必须在 group by
子句,现在你知道了。
由于你评论说你只想显示 client_name
而不是 client_id
(而它必须在 group by
子句),将当前查询作为 源头 为最终结果。
select client_name
from (-- current query begins here
select cp.client_id,
c.client_name
from clients c join client_provider cp on c.client_id = cp.client_id
group by cp.client_id,
c.client_name
having count(*) > 1
-- current query ends here
);
或者,你也可以用(稍加修改的)当前查询作为子查询。
select cl.client_name
from client cl
where cl.client_id in (select cp.client_id
from client_provider cp
group by cp.client_id
having count(*) > 1
);