本帖最后由 yinan9 于 2013-05-01 00:42:25 编辑

解决方案 »

  1.   


    没怎么看明白你的要求哦...
    就是根据T1表的Name, A,B,C,在T2表找到完全匹配的组,A,B,C
     然后把GroupID 更新给T1目前T2只存在两个组,而且Name与T1中的Name不完全一致,所以给T1一个新的GroupID
      

  2.   

     Name的个数 ,如T1 Name有3个 A,B,C
    在T2表也找到这样一个GroupID 它下边的Name也正是A,B,C 不多不少
      

  3.   

    如果T2的数据是这样的,怎么搞
    NAME  GroupID
    A       1
    B       1
    C       1
    A       2
    B       2
    C       2
      

  4.   

    还是PL/SQL比较容易实现,一条SQL还是比较复杂...
      

  5.   

    只能用sql么,不能用pl/SQL??
    明天上班给你看看
      

  6.   

    的确, 困扰我很久的一个逻辑,问题我要在Teradata下实现,所以只能通过一条SQL
      

  7.   

    好的,其实这个逻辑是需要在Teradara中实现,所以就无法使用pl/sql了
      

  8.   


    ...如果一条sql实现的话,使用FUNCTION.....
      

  9.   


    没有找到更好的方法.... 肯定是有更好的方法.... 下面是我的通过function来解决的思路,没有考虑效率,没有考虑优化:--创建测试数据
    CREATE TABLE T1(
      NAME VARCHAR2(10),
      GROUPID NUMBER(10)
    );
    CREATE TABLE T2(
      NAME VARCHAR2(10),
      GROUPID NUMBER(10)
    );
    INSERT INTO T1 VALUES('A',NULL);
    INSERT INTO T1 VALUES('B',NULL);
    INSERT INTO T1 VALUES('C',NULL);
    INSERT INTO T2 VALUES('A',1);
    INSERT INTO T2 VALUES('C',1);
    INSERT INTO T2 VALUES('B',2);
    INSERT INTO T2 VALUES('C',2);
    --写一个function返回相应的GROUPID
    CREATE OR REPLACE FUNCTION GETGROUPID(PRM_STR VARCHAR2)
    RETURN NUMBER AS
      N_GROUPID T2.GROUPID%TYPE;
    BEGIN
       SELECT GROUPID INTO N_GROUPID FROM 
       (
       SELECT REPLACE(TRANSLATE(PRM_STR,STR,','),',') AS RESULT,GROUPID FROM
       (SELECT WMSYS.WM_CONCAT(NAME) AS STR,GROUPID FROM T2 GROUP BY GROUPID)O
       )
       WHERE RESULT IS NULL;
       RETURN N_GROUPID;
       EXCEPTION
       WHEN NO_DATA_FOUND THEN
           SELECT MAX(GROUPID) INTO N_GROUPID FROM T2;
           RETURN N_GROUPID+1;
    END;
    --测试function 应当返回相应的结果
    SELECT GETGROUPID('B,C') FROM DUAL;   --2
    SELECT GETGROUPID('A,C') FROM DUAL;   --1
    SELECT GETGROUPID('A,B,C') FROM DUAL;   --3
    --完成楼主的要求
    UPDATE T1 SET T1.GROUPID = (SELECT GETGROUPID(WMSYS.WM_CONCAT(NAME)) FROM T1);
      

  10.   

    UPDATE T1 SET T1.GROUPID = (SELECT GroupID
      FROM (SELECT ROW_NUMBER() OVER(ORDER BY FLG) AS RN, GroupID
              FROM (SELECT FLG, GroupID
                      FROM (SELECT '1' AS FLG, T2.GroupID, COUNT(1) AS CN1
                              FROM T2
                             INNER JOIN T1 ON T2.NAME = T1.NAME
                                          AND T1.NAME IS NOT NULL
                             GROUP BY T2.GroupID)
                     WHERE CN1 = (SELECT COUNT(1) FROM T1)
                    UNION ALL
                    SELECT '2' AS FLG, MAX(GroupID) + 1 AS GroupID FROM T2))
     WHERE RN = 1)
      

  11.   

    看到的一个新鲜的写法,给楼主参考一下:update t1
       set t1.groupid =
           (SELECT decode(MAX(min_groupid),
                          -1,
                          MAX(max_groupid) + 1,
                          MAX(min_groupid)) groupid
              FROM (SELECT MIN(decode(t2.NAME, NULL, -1, t2.groupid)) over(PARTITION BY t2.groupid) min_groupid,
                           MAX(t2.groupid) over() max_groupid,
                           t2.*
                      FROM t1
                      LEFT JOIN t2 PARTITION BY(t2.groupid)
                        ON t1.NAME = t2.NAME))