条件是这样的A表有字段:id name p_id
P表:与A表一对多(一P多A),字段:id p_name B表,与A表多对一关系(一A多B),字段:id a_id(外键,=A表id)b_name
C表,与A表多对一关系(一A多C),字段:id a_id(外键,=A表id)c_name
D表,与A表多对一关系(一A多D),字段:id a_id(外键,=A表id)d_name
现在我的查询得到的结果是:
得到A表的name  B表的b_name拼接拼接同a_id的为一个字符串  C表的c_name拼接同a_id的为一个字符串   C表的c_name拼接同a_id的为一个字符串比如有数据是:
P:id p_name
    1  中国
A:id  name p_id
    1  北京
B: id a_id b_name
    1  1    描述1
    2  1    描述2
c: id a_id b_name
    1  1    价格1
    2  1    价格2
    3  1    价格3
d: id a_id b_name
    1  1    列表1
    2  1    列表2我希望的结果是
  a.id a.name p.p_name b.b_name       c.c_name              d.d_name
  1     北京    全国   描述1,描述2   价格1,价格2,价格3    列表1,列表2 请问应该怎么写,谢谢帮助

解决方案 »

  1.   

    SQL> with t1 as (select a_id,wm_concat(b_name) b_name from (select * from b order by b.a_id,b.id asc) group by a_id ),
      2         t2 as (select a_id,wm_concat(c_name) c_name from (select * from c order by c.a_id,c.id asc) group by a_id ),
      3         t3 as (select a_id,wm_concat(d_name) d_name from (select * from d order by d.a_id,d.id asc) group by a_id )
      4    select a.id,a.name,p.p_name,t1.b_name,t2.c_name,t3.d_name
      5      from a,p,t1,t2,t3
      6     where a.p_id=p.id and a.id=t1.a_id and a.id=t2.a_id and a.id=t3.a_id
      7  ;
     
    ID NAME       P_NAME     B_NAME          C_NAME                D_NAME
    -- ---------- ---------- --------------  -----------------     -----------
     1 北京       中国       描述1,描述2     价格1,价格2,价格3     列表1,列表2
     
    SQL> 
      

  2.   


      select p_name,a.name,wm_concat(b_name) as b_name,wm_concat(c_name) as c_name,
      wm_concat(d_name) as d_name from 
      p,a,b,c,d
      where p.id=a.p_id and a.id=b.a_id and a.id=c.a_id and a.id=d.a_id
      group by p_name,a.name
      

  3.   

     select p_name,a.name,wm_concat(b_name) as b_name,wm_concat(c_name) as c_name,
      wm_concat(d_name) as d_name from 
      p,a,b,c,d
      where p.id=a.p_id and a.id=b.a_id and a.id=c.a_id and a.id=d.a_id
      group by p_name,a.name
      

  4.   

     把所有的wm_concat(b_name),改成这样
    replace(wm_concat(b_name),',',' ')
      

  5.   

    直接关联的话,有点类笛卡尔积.因为是n对m的链接,所以肯定是n*m中接过,也不是不可以实现,使用分析函数排序,然后递归函数取数据,但是效率是个问题啊.
      

  6.   

    听上去好绕啊,其实也不要求一定要一个sql语句搞定,主要是,如果对每个数据都分别差他的3个子表实在是太浪费资源了,但是一次查出来貌似也不太可能实现,我自己都晕菜了,不知道有没有好的建议。就解答TAT
      

  7.   


    其实就是连表查询查询A表所有字段,和A表的三个子表的所以字段(每个子表与A表都是多对一的关系,三个子表相互没有关联),和A表的父表大部分字段。(其实该父表还有一个子表TAT,要命么这不是)····
      

  8.   

    其实拼接是最下下之选,因为在数据库搞拼接效率忒低了,而且取回还后还要再拆开,如果拼接的字符串中本身有“,”,那么就悲剧了TAT。
       刚刚看到楼上的同志们之中有人这么写:
      replace(wm_concat(b_name),',',' ')
    但是这样不就相当于将","替换了么,?
    即使将“,”替换为其他字符,我也不知用什么字符,毕竟我的表单里的数据貌似什么符号都允许,不知道将“,”换成什么。
    逼急了我就一个一个查TAT555
      

  9.   

    呵呵,谢谢,其实就这次提问的问题而已,已经可以结贴了,但是我估计最后我可能不会选择拼接,或者最终选择将A表的两个较小的子表拼接,然后另一个数据较多的就不拼接字符串。谢谢大家的帮忙~TAT