表A的字段ID记录在表B上,表A的一行可能对应表B的多行,现在想把表B的字段NUM写到表A中,如果有多个NUM则用"#"写入,如果只有一个则写入NUM的值。附加问题:如果不用#而是用两个NUM逗号分隔的字符串写入又该如何?

解决方案 »

  1.   

    没环境,没测试过。大概就这样吧。调一下。update A set A.num = temp.thenum
    from
    (
    select b.id id,case when count(num)>1 then ‘#’else num end thenum from B b
    inner join A a on a.id  = b.id
    group by b.id
    )temp
    where a.id = temp.id
    附加:
    update A set A.num = temp.thenum
    from
    (
    select b.id id,wm_concat(num) thenum from B b
    inner join A a on a.id = b.id
    group by b.id
    )temp
    where a.id = temp.id
      

  2.   


    CREATE TABLE a(id NUMBER, num varchar2(20));
    CREATE TABLE b(id NUMBER, num varchar2(20));
    --1
    UPDATE a
       SET a.num =
           (SELECT CASE
                     WHEN COUNT(*) > 1 THEN
                      '#'
                     ELSE
                      MAX(num)
                   END
              FROM b
             WHERE b.id = a.id)
     WHERE EXISTS (SELECT 1 FROM b WHERE b.id = a.id);--2
    UPDATE a
       SET a.num =
           (SELECT wm_concat(num) FROM b WHERE b.id = a.id)
     WHERE EXISTS (SELECT 1 FROM b WHERE b.id = a.id);
      

  3.   

    若是9i,wm_concat函数可替换成{sql}select b_id, ltrim(max(sys_connect_by_path(b_name, ',')), ',') b_name
      from (select b_id,
                   b_name,
                   b_name bn,
                   min(b_name) over(partition by b_id) d_min,
                   (row_number() over(order by b_id, b_name)) +
                   (dense_rank() over(order by b_id)) numid
              from bb)
     start with bn = d_min
    connect by numid - 1 = prior numid
     group by b_id; 
      

  4.   

    wm_concat这个是标准函数吗?这么神奇?
      

  5.   

    wm_concat是10g才有的,是一个未公开的函数。
      

  6.   

    10g以上的可以用listagg函数
    update a
      set a.num = 
        (select listagg(b.num,',') with group (order by num)
           from b
           where a.id = b.id
        )