tab1
c1(char(3))    c2(char(4)) c3(number(13,0))
100 1000 100
100 1000 100
101 1001 200
101 1100 200
101 1002 100
101 2001 200
101 3001 300
102 1002 300
201 2000 100
201 2001 200
202 2002 300
202 2002 500
300 3000 100
tab2
c1(integer) c2(char(4)) c3(char(4)) c4(char(4))
1 1000 1100 1002
2 2100            2001            2002
3 3001 3003 3900
想要得到如下的结果集:
tab1.c1 tab2.c1 sum(c3) {对tab2每一个c1来说where tab1.c2 in c2,c3,c4;如果tab1.c2在tab2中的每一个c1中的c2,c3,c4都不存在,结果集中就不检索出来,如tab1.c1='300'}
100 1 200 (1000)
100 2 0
100 3 0
101 1 300 (1100,1002)
101 2 200 (2001)
101 3 300 (3001)
102 1 300 (1002)
102 2 0
102 3 0
201 1 0
201 2 200 (2001)
201 3 0
202 1 0
202 2 800 (2002)请问oracle中的sql应该如何来写啊?

解决方案 »

  1.   

    select tab1.c1,tab2.c1,sum(c3) from tab1,tab2 where tab1.c2 = tab2.c2 or tab1.c2 = tab2.c3 or tab1.c2 = tab2.c4 group by tab1.c1,tab2.c1
      

  2.   

    楼上的似乎对自己蛮有信心的,不过你的sql文不对,用你的sql执行后跟我需要的结果完全不一致,大哥,麻烦你也先自己试一下再贴上来啊。不过还是要感谢你的热心。
      

  3.   

    With a As (select tab1.c1 As ID,  tab2.c1 As NUM, sum(tab1.c3) As cal from tab1, tab2 where tab1.c2=tab2.c2 or tab1.c2=tab2.c3 or tab1.c2=tab2.c4 group by tab1.c1,tab2.c1),
     b As (select tab1.c1 As ID,  tab2.c1 As NUM from tab1, tab2 where tab1.c2 in((select c2 from tab2) union (select c3 from tab2) union (select c4 from tab2)))
    select ID, NUM, 0 from (b minus (select a.ID, a.NUM from a)) Union a
      

  4.   

    /*--临时表p ,可以内嵌
    select tab1.c1 k1,tab1.c2 k2,tab1.c3 k3,tab2.c1 k4,tab2.c2 k5,tab2.c3 k6,tab2.c4 k7 from tab1,tab2,
    (
    select tab1.c1 p1,tab2.c1 p2 from tab1,tab2 group by tab1.c1,tab2.c1
    ) p where
    tab1.c1=p.p1  and tab2.c1=p.p2*/
    /*--查询
    select a.n1,a.n2,isnull(b.c3,0) from (select tab1.c1 n1,tab2.c1 n2 from tab1,tab2,  
    (select p.k1 from p where p.k2 in (p.k5,p.k6,p.k7) group by p.k1) m where m.k1=tab1.c1 group by tab1.c1,tab2.c1) a left join(select tab1.c1 c1,tab2.c1 c2,sum(tab1.c3) c3 from tab1,tab2 where tab1.c2 in (tab2.c2,tab2.c3,tab2.c4) group by tab1.c1,tab2.c1) bon a.n1=b.c1 and a.n2=b.c2 order by a.n1, a.n2
    */
      

  5.   

    赫赫,弄清楚自己的思路的话,就很简单了.
    不用自己想复杂的.SELECT T1_C1 , T2_C2 , SUM ( T1_C3 ) 
    FROM ( 
            SELECT TAB1.C1 T1_C1 , TAB2.C1 T2_C2 , 
                    DECODE ( TAB1.C2 , TAB2.C2 , TAB1.C3 , TAB2.C3 , TAB1.C3 , TAB2.C4 , TAB1.C3 , 0 ) T1_C3 
            FROM TAB1 , TAB2 
            WHERE TAB1.C1 
                    IN ( SELECT TAB1.C1 FROM TAB1 , TAB2 WHERE ( TAB2.C2 = TAB1.C2 OR TAB2.C3 = TAB1.C2 OR TAB2.C4 = TAB1.C2 ) ) ) 
    GROUP BY T1_C1 , T2_C2 
    ORDER BY T1_C1 , T2_C2