如何编写SQL查询以获取以下方案输出

时间:2018-08-12 07:21:42

标签: sql oracle oracle-sqldeveloper

我有2个如下表,我需要来自客户端表的client_ID和来自角色表的“角色”,但是获取表中数据的条件是,客户端具有一个以上的creation_type。

请找到下面的示例表和输出。

客户表

Client_ID   cname   Contribution_type
-------------------------------------   
   1        A       Regular
   2        B       public 
   3        C       regular
   4        D       private
   1        A       public 
   4        D       similar

角色表

Client_ID   Rname
------------------    
   1        owner
   2        owner
   3        trustee
   4        benificier
   1        trustee
   2        benificier
   3        owner
   4        owner

输出

Client_ID   Rname
-------------------    
    1       owner
    1       trustee
    4       beneficiary
    4       owner

我编写了以下查询,但收到以下错误

select 
    c.cid, r.rname 
from 
    Client_table c 
join 
    role_table r on c.cid = r.CID
where 
    c.cid in (select cl.CID, count(Contribution_type) 
              from Client_table c 
              group by cl.CID 
              having count(Contribution_type) > 1);

错误消息:

  

ORA-00913:值太多
  00913. 00000-“值太多”
  *原因:
  *动作:
  在第21行的错误:第9列

谢谢。

5 个答案:

答案 0 :(得分:1)

尝试在您的count(Contribution_type)子查询中删除where。因为In只能比较一列。

select c.cid,r.rname
from Client_table c 
join role_table r on c.cid = r.CID
where c.cid in (select cl.CID from Client_table c group by cl.CID having count(Contribution_type)>1);

或者您可以只在from中而不是在where中编写子查询。

select c.cid,r.rname 
from (
  select cl.CID 
  from Client_table c
  group by cl.CID 
  having count(c.Contribution_type)>1
) c 
join role_table r on c.cid = r.CID

答案 1 :(得分:1)

这将为您完成。 假设在同一contribution type出现多次的情况下,您只想要一个实例,则使用count (distinct contribution_type),否则仅使用count(contribution_type)

select * from role r
where r.client_id in
    (select client_id from client c
    group by client_id 
    having count(distinct contribution_type)>1
    )

发生错误的原因是,在您的IN子句中,您仅提及1个值,但是您要从子查询中获取多个1个值,因此出错。

答案 2 :(得分:0)

select c.cid,r.rname from Client_table c join role_table r on c.cid = r.CID
where c.cid in (select cl.CID from Client_table c group by cl.CID having count(Contribution_type)>1);

在子查询中删除 count(Contribution_type)

答案 3 :(得分:0)

它将完成:

select  distinct client_id,rname from role_table where client_id in(1,4) order by client_id;

答案 4 :(得分:0)

您的问题是子查询返回多个列。但是,您还可以简化外部查询:

select r.cid, r.rname 
from role_table r
where r.cid in (select c.CID  -- only one column here
                from Client_table c 
                group by c.CID 
                having count(c.Contribution_type) > 1
               );

换句话说,您不需要加入Client_table,因为您拥有role_table中所有需要的字段。