获取DB2中所有行中只具有相同值的数据

时间:2014-06-14 08:03:09

标签: sql db2

我在DB2中有两个表:

1) users ==> basic user details

2) details ==> more user details

“details”表包含名为ssn,company和super_company的列。 company和super_company列可以为同一个SSN提供多个值。

问题:我正在尝试仅提取与ssn具有相同super_company的用户。

我需要输出中的用户名,ssn和company_id。

我尝试了分组但不确定如何继续,因为我是DB2的新手。

SQL小提琴: http://www.sqlfiddle.com/#!2/6d378/1/0

请注意,sql fiddle不支持DB2。我提供的只是提供表结构。

3 个答案:

答案 0 :(得分:1)

您可以使用此查询

select U.account_id, U.username from users U
  join details D
    on U.account_id = D.account_id
group by U.account_id, U.username
having count(distinct super_company) = 1

SQL FIDDLE

答案 1 :(得分:1)

您说输出中需要company,但是当有多家公司时您没有说要做什么。这是一种方法,每个用户输出一行任意公司:

select u.username, u.accound_id, d.ssn as ssn,
       min(d.company) as company, min(d.super_company)
from users u join
     details d
     on u.accound_id = d.accound_id
group by u.username, u.accound_id
having min(d.super_company) = max(d.super_company);

实际上将多个company值聚合到一个字符串中比在DB2中应该更难。您也可以获取匹配用户的个人记录。我会使用窗口函数来执行此操作:

select username, accound_id, ssn, company, super_company
from (select u.username, d.*,
             min(super_company) over (partition by ssn) as minsc,
             max(super_company) over (partition by ssn) as maxsc
      from users u join
           details d
           on u.accound_id = d.accound_id
     ) t
where minsc = maxsc;

这更接近您的具体问题,即ssn的重复问题,因为在查找重复项时,它不包括usernameaccound_id

答案 2 :(得分:0)

select d.*, u.* 
from details d
join users u
    on u.accound_id = d.accound_id
join (
    select accound_id
    from details
    group by accound_id
    having count(distinct super_company) = 1
) x
   on x.accound_id = u.accound_id