SELECT外键重复的值。

问题描述 投票:0回答:1

假设我们有 clientsproviders. 一个客户可以有多个供应商(如网络、电话、电视等),我想找到拥有多个供应商的客户的名字。

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;
sql oracle sqlplus
1个回答
2
投票

当使用 GROUP BY 所有使用的列都应该是在 GROUP BY 或在一个集合函数中。要解决这个问题,请执行以下操作。

  1. 添加 cp.client_idSELECT 条款
  2. 添加 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

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
                      );
© www.soinside.com 2019 - 2024. All rights reserved.