2013-02-20 57 views
0

嗨,我有3个表,我想加入他们得到一个愿望表。我尝试了分组和临时表选项来获得所需的表,但没有帮助。我想避免从另一个表中的一个表中的每个值的每个实例重复。当与表加入时,避免重复每个实例的行

表1客户表:

CstId   CstDetails  CstType  
---------- --------------- ------------ 
    1   address 1   1 
    2   address 2   1 
    3   address 3   1 
    4   address 4   2 
    5   address 5   2 

表2客户关系:

CstId   CstGroupId 
---------- ---------------- 
    1    4 (this is same as CustomerId) 
    2    5 (this is same as CustomerId) 
    3    4 (this is same as CustomerId) 

表3顾客注:

CstId   NotesId  NoteTxt 
----------- --------- --------- 
    1   1   note11 
    1   2   note12 
    1   3   note13 
    3   1   note31 
    4   1   note41 
    4   2   note42 
    4   3   note43 
    4   4   note44 
    4   5   note45 

现在我想的结果是在下述格式

Table result: 
            (NoteId) (Notetxt) (NoteId)   (Notetxt) 
    CstId CstDetails CstGroupId CstNoteId CstNote CstGroupNoteId CstGroupNote 
     1 address1  4   1   note11  1    note41 
     1 address1  4   2   note12  2    note42 
     1 address1  4   3   note13  3    note43 
     1 address1  4   null  null   4    note44 
     1 address1  4   null  null   5    note45 

但我正在为所有CstNote重复CstGroupNote,我试图避免。

有没有办法实现这个结果?

下面是我使用的代码:

select c.cstid, c.cstdetails, cn.cstnotesid, cn.cstnotetxt 
insert into temp1 
from customer c 
    left outer join customernotes cn 
     on c.cstid = cn.cstid 
where c.customertypeid = 1 

select cr.cstid, cr.cstgroupid, cn.cstgroupnoteid, cn.cstnotetxt 
insert into temp2 
from customerrelationship cr 
    left outer join customernotes cn 
     on cr.cstgroupid = cn.customerid 

select t1.cstid, t1.cstdetails, t1.cstnotesid, t1.cstnotetxt, t2.cstgroupnoteid, t2.cstnotetext 
from temp1 t1 
    left outer join t2 
     on t1.cstid = t2.cstid 
+0

到目前为止您的查询是什么? – dotjoe 2013-02-20 15:56:57

+0

我已创建2个临时表之一来获得customernotes和第二得到groupnotes,然后我加入都与左外临时表联接根据客户ID下面 – user2091818 2013-02-20 16:01:01

+0

是我使用的代码:选择c.cstid,c.cstdetails,CN。 cstnotesid,cn.cstnotetxt 从客户C插入temp1中 \t左外连接CN \t \t customernotes上c.cstid = cn.cstid 其中c.customertypeid = 1个 选择cr.cstid,cr.cstgroupid,CN .cstgroupnoteid,cn.cstnotetxt 从customerrelationship插入到temp2 cr \t左外连接自定义ernotes CN \t \t上cr.cstgroupid = cn.customerid 选择t1.cstid,t1.cstdetails,t1.cstnotesid,t1.cstnotetxt,t2.cstgroupnoteid,t2.cstnotetext 从T1的temp1 \t左外连接T2 \t \t on t1.cstid = t2.cstid – user2091818 2013-02-20 16:11:56

回答

0

尝试:

select CstId, 
     max(CstDetails) CstDetails, 
     max(CstGroupId) CstGroupId, 
     max(CstNoteId) CstNoteId, 
     max(CstNote) CstNote, 
     max(CstGroupNoteId) CstGroupNoteId, 
     max(CstGroupNote) CstGroupNote 
from 
(select c.CstId, 
     c.CstDetails, 
     0 CstGroupId, 
     n.NotesId CmbNotesId, 
     n.NotesId CstNoteId, 
     n.NoteTxt CstNote, 
     0 CstGroupNoteId, 
     '' CstGroupNote 
from customer c 
left outer join customernotes n on c.cstid = n.cstid 
where c.customertypeid = 1 
union all 
select c.CstId, 
     c.CstDetails, 
     r.CstGroupId, 
     n.NotesId CmbNotesId, 
     0 CstNoteId, 
     '' CstNote, 
     n.NotesId CstGroupNoteId, 
     n.NoteTxt CstGroupNote 
from customer c 
left outer join customerrelationship r on c.cstid = r.cstid 
left outer join customernotes n on r.CstGroupId = n.cstid 
where c.customertypeid = 1) u 
group by CstId, CmbNotesId 
+0

谢谢你的解决方案同样的事情,这真的帮了我所需的表。 – user2091818 2013-02-21 23:32:29

+0

@ user2091818:很高兴能帮到你。 – 2013-02-22 09:51:59

0

使用派生表和外部联接
有诀窍的
和cn.cstnotesid =鸟苷.cstnotesid
将这两个链接在一行上

select c.cstid, c.cstdetails, cn.cstnotesid, cn.cstnotetxt 
     ,cG.CstGroupId, cG.cstnotesid, cG.cstnotetxt 
from customer c 
join customernotes cn 
    on cn.cstid = c.cstid 
outer join (select c.cstid, c.CstGroupId, cn.cstnotesid, cn.cstnotetxt 
       from customer c 
       join customernotes cn 
       on cn.cstid = c.CstGroupId) as cG 
     on c.cstid = cG.cstid 
     and cn.cstnotesid = cG.cstnotesid 
order by c.cstid, cn.cstnotesid, cG.cstnotesid 
+0

谢谢,但是你的解决方案只有在notesid匹配的情况下才起作用,在我的情况下它不是一直如此。 – user2091818 2013-02-21 23:31:32