sql—选择外键重复的值

ve7v8dk2  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(231)

假设我们有 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;
u3r8eeie

u3r8eeie1#

使用时 GROUP BY 所有使用的列都应在 GROUP BY 或者在聚合函数中。要解决此问题,请执行以下操作:
添加 cp.client_idSELECT 条款
添加 c.client_nameGROUP 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
cigdeys3

cigdeys32#

所有非聚合列必须在 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
                      );

相关问题