是否可以从多行中选择数据以便在一行中输出?

时间:2016-07-22 16:03:29

标签: sql oracle

我有2个数据库。我想编写一个查询,从两者中提取数据并将它们绑定到相同的结果中。

用户数据库:

id  username  group
1   steve     group1
2   joe       group1
3   tom       group2

数据库:

id  userid  fieldname   fieldresult
1   2       phone       867-5309
2   2       address     123 elm st
3   1       address     666 park avenue

如果我只想要史蒂夫的地址,我可以写:

select user.username, data.fieldresult from user, data where user.id = data.userid and data.fieldname = 'address' and user.username = 'steve';

结果将是:

username    fieldresult
steve       666 park avenue

但是如果我想把乔的所有现场结果放在一行呢?这可以从查询本身做到,还是我必须在代码中处理?

基本上,我想看看:

username    phone       address
joe         867-5309    123 elm st
这是一厢情愿的想法吗?我甚至不需要“电话”和“地址”作为标题,只要我能得到相同结果的值。

注意:我正在使用现有数据库,这就是当前信息的存储方式。

编辑: 此外,我需要在更大的基础上这样做。我可以以相同的方式为整个组中的每个用户获取此信息,而不是通过用户名查询。

3 个答案:

答案 0 :(得分:1)

尝试

select      a.username,
            b.fieldresult as phone,
            c.fieldresult as address
from        #user a
left join   #data b on a.id=b.userid and b.fieldname='phone'
left join   #data c on a.id=c.userid and c.fieldname='address'
where       a.id = 2

答案 1 :(得分:1)

您可以尝试在datadb表中转动联系人信息,然后将其与用户

连接
select * from userdb..[user] u join
 (
 select userid,phone, address from 
 (
 select userid,fieldname,fieldresult from datadb..data  
 ) as a pivot 
 (
  max(fieldresult) for fieldname in (phone, address)
 ) piv ) as a
on a.userid = u.id

这将产生如下内容。

id  username    group   userid  phone   address
1   steve       group1      1   NULL     park aven
2   joe         group1      2   867-5309    123 elm st

答案 2 :(得分:-1)

我使用的两个表是user_和data。 希望,这可能对你有帮助

DECLARE
user_name user_.username%type:='joe';
phone_no data.fieldresult%type;
full_address data.fieldresult%type;
user_id user_.id%type;

CURSOR c_name IS select * from data;
result c_name%rowtype;

BEGIN

select id into user_id from user_ where username=user_name; 
open c_name;

LOOP

fetch c_name into result;

IF ( result.userid=user_id AND result.fieldname='phone') THEN
phone_no:=result.fieldresult;
END IF;  

IF(result.userid=user_id AND  result.fieldname='address') THEN
full_address:=result.fieldresult;
END IF;


EXIT when c_name%NOTFOUND;
END LOOP;
close c_name;

dbms_output.put_line(user_name||'       '||phone_no||'      '||full_address);

END;
/

输出:joe 867-5309 123 elm st