+ -
当前位置:首页 → 问答吧 → 求高手写个sql实现两个表的数据的迁移。

求高手写个sql实现两个表的数据的迁移。

时间:2011-11-02

来源:互联网

有如下2张表,A(id,ip,port) B(id,ip,port1,port2)
A中的数据都是相同的一个ip对应2个port。如:
1,10.10.10.10,8090
2,10.10.10.10,8091
3,10.10.10.20,8092
4,10.10.10.20,8093
现在需要将表A中的数据转移到表B中,将ip相同的数据合并成一条数据,即入到表B中的数据只有2条。
1,10.10.10.10,8090,8091
3,10.10.10.20,8092,8093
请求这个sql如何写啊?万分感谢啊

作者: guwen391   发布时间: 2011-11-02

Oracle10g或以上可以用这句
INSERT INTO B (id,
  ip,
  port1,
  port2)
  SELECT ROWNUM id,
  ip,
  SUBSTR (port, 1, INSTR (port, ',') - 1) port1,
  SUBSTR (port, INSTR (port, ',') + 1) port2
  FROM ( SELECT ip, wm_concat (port) port
  FROM a
  GROUP BY ip)

作者: tx2730   发布时间: 2011-11-02

忘记保留原来的ID
INSERT INTO B (id,
  ip,
  port1,
  port2)
  SELECT id,
  ip,
  SUBSTR (port, 1, INSTR (port, ',') - 1) port1,
  SUBSTR (port, INSTR (port, ',') + 1) port2
  FROM ( SELECT MIN (id) id, ip, wm_concat (port) port
  FROM a
  GROUP BY ip)

作者: tx2730   发布时间: 2011-11-02

SQL code

INSERT INTO B_TBL
  SELECT MIN(ID),
         IP,
         MIN(PART) PART1,
         CASE
           WHEN MAX(PART) = MIN(PART) THEN
            NULL
           ELSE
            MAX(PART)
         END PART2
    FROM A_TBL
   GROUP BY IP;
--B_TBL是你的B表
--A_TBL是你的A表

INSERT INTO B_TBL
  SELECT MIN(ID),
         IP,
         MIN(PART) PART1,
         CASE
           WHEN MAX(PART) = MIN(PART) THEN
            NULL
           ELSE
            MAX(PART)
         END PART2
    FROM A_TBL
   GROUP BY IP;


作者: yinan9   发布时间: 2011-11-02

SQL> SELECT * FROM b_tbl;

  ID IP PART1 PART2
---------- -------------------------------------------------- -------------------------------------------------- --------------------------------------------------
  1 10.10.10.10 8090 8091
  3 10.10.10.20 8092 8093
  1 10.10.10.10 8090 8091
  3 10.10.10.20 8092 8093

作者: yinan9   发布时间: 2011-11-02