当我不仅使用一次结果时,如何在Oracle中存储sql结果?

时间:2016-09-03 04:34:06

标签: sql oracle oracle11g

我有三张桌子t_group,t_group_linkman,t_linkman。 T_group可以根据t_group表中的parent_id字段拥有其父组,并且t_linkman根据t_group_linkman表中的group_id字段具有其父组。现在我想选择所有组和linkman。所以我写了sql,但我发现我已经两次搜索该组。任何人都可以提出改变我的sql语句的建议吗?

(select  ''||id as id,parent_id as p_Id,name,null mobileNum1 from t_group)  
UNION 
(select tgl.group_id|'_'||l.id as id,tgl.group_id as 
p_Id,l.name,l.mobile_Num1 from t_linkman l 
inner join t_group_linkman tgl  on tgl.LINKMAN_ID=l.id 
where tgl.GROUP_ID in(select id from t_group
) and l.STATUS='Y')

现在在我的sql语句中,我已经两次搜索t_group。

例如,测试数据:

t_group table:

id |parent_id|name
---|---------|-------
1  |0        |group1
2  |0        |group2
3  |2        |group3

t_linkman表:

id|name     |mobileNum1 
--|---------|-----------
1 |linkman1 |15624157851       
2 |linkman2 |15624157852              
3 |linkman3 |15624157853 

t_group_linkman表:

id|group_id | linkman_id
--|---------|-----------
1 |1        |1      
2 |2        |2              
3 |3        |3                    
4 |2        |3 

我想返回结果(所有组和所有联系人):

id  |parent_id|name      |mobileNum1
----|---------|----------|-----
1   |0        |group1    |null
2   |0        |group2    |null
3   |2        |group3    |null
1_1 |1        |linkman1  |15624157851       
2_2 |2        |linkman2  |15624157852       
3_3 |3        |linkman3  |15624157853       
2_4 |2        |linkman4  |15624157853     

1 个答案:

答案 0 :(得分:1)

可能你正在寻找左联盟

select tg.id as tg_id, tg.parent_id as p_Id, tg.name, l.mobileNum1
from t_group tg
LEFT JOIN t_group_linkman tgl on tgl.group_id = tg.id
LEFT JOIN t_linkman l on tgl.LINKMAN_ID=L.id 
WHERE l.STATUS='Y'

假设t_group和t_group_linkman之间的关系为1:1,而t_group_linkman和t_linkman之间的关系为1:M

如果t_group和t_group_linkman也有1:M,那么也将第一次连接切换为左连接

如果您提供一些数据示例,我可以根据您的需求定制查询

更新1: 看起来这是您一直在寻找的查询:

select to_char(tg.id), tg.parent_id, tg.name, l.mobileNum1
    from t_group tg
    inner join t_group_linkman tgl  on  tg.id=tgl.group_id
    left join t_linkman l on tgl.linkman_id=l.id
UNION ALL
select to_char(tgl.group_id) || '_' || to_char(tgl.id), tgl.group_id, l.name, l.mobileNum1
    from t_group_linkman tgl 
    left join t_linkman l on tgl.linkman_id=l.id