从sql中的select语句插入多行

从sql中的select语句插入多行,sql,oracle,select,insert,Sql,Oracle,Select,Insert,我有一个表需要迁移到新表 表A迁移到表B 表A | ID | type | | A1 | A | | A2 | B | | A3 | A | | A4 | both | | A5 | A | 我希望B表是这样的 表B | ID | FKA | TYPE | | B1 | A1 | Aa | | B2 | A2 | Bb | | B3 | A3 | Aa | | B4 | A4 |

我有一个表需要迁移到新表

表A迁移到表B

表A

| ID   | type |

| A1   |  A   |
| A2   |  B   |
| A3   |  A   |
| A4   | both |
| A5   |  A   |
我希望B表是这样的

表B

| ID   | FKA  |  TYPE |

| B1   |  A1  |   Aa  |
| B2   |  A2  |   Bb  |
| B3   |  A3  |   Aa  |
| B4   |  A4  |   Aa  |
| B5   |  A4  |   Bb  |
| B6   |  A5  |   Aa  |
如果您意识到,如果type是both,它将在表A的表B中插入两次

**FKA是表A中的外键

目前我有3个查询

问题1:

insert into tableB
select sequence1.nextVal, ID, 
(case
when type = 'A' then 'Aa'
when type = 'B' then 'Bb'
when type = 'both' then 'Aa'
else NULL
end
) from tableA
问题2

insert into tableB
select sequence1.nextVal, ID, 
(case
when type = 'both' then 'Bb'
else 'laterdelete'
end
) from tableA
问题3

delete from tableB where type = 'laterdelete'

谢谢大家

我想rdbms是Oracle。您可能希望使用这些值创建一个表(例如“tablemapping”)

 FieldFrom FieldTo
 A         Aa
 B         Bb
 both      Aa
 both      Bb
所以你可以做的只是:

 Insert into tableB
 select sequence1.nextval, ID, FieldTo
    FROM tableA a 
         join tablemapping m 
           on a.type=m.fieldFrom
如果您不想拥有映射表,可以模拟一个映射表

 Insert into tableb
 select sequence1.nextval, ID, FieldTo
    FROM tableA a 
         join (
               select 'both'  as FieldFrom,  'Ab'  as FieldTo from dual
                Union all
               select 'both'  as FieldFrom,  'Bb'  as FieldTo from dual
                Union all
               select 'A'  as FieldFrom,  'Aa'  as FieldTo from dual
                Union all
               select 'B'  as FieldFrom,  'Bb'  as FieldTo from dual
              ) tablemapping m 
           on a.type=m.fieldFrom

您可以在第一个查询中使用union,以在表B中获得所需的结果。 查询如下:

insert into tableB
select sequence1.nextVal, ID, 
(case
when type = 'A' then 'Aa'
when type = 'B' then 'Bb'
when type = 'both' then 'Aa'
else NULL
end
) from tableA
UNION
select sequence1.nextVal, ID, 
(case
when type = 'A' then 'Aa'
when type = 'B' then 'Bb'
when type = 'both' then 'Bb'
else NULL
end
) from tableA
当类型都在tableA中时,上述查询将在tableB中插入Aa和Bb。
希望这有帮助。

哪种rdbms?我认为可以使用映射表或嵌入在模拟映射表的查询中的子查询。如果我的理解是正确的,我有点担心对序列的两次调用。它将为同一记录生成两倍的相同值?我尝试了这个查询。我想@Insac是对的。它将生成twicewith error SQL error:ORA-02287:此处不允许使用序列号您可以使用(按ID排序)上的行号()而不是序列号每次运行查询时它是否会添加从1开始?我不太了解映射表。但我会稍后再试。但是我的表包含或包含数百万个查询,它会影响性能吗?可能会(我们必须查看索引和执行计划)。然而,它仍然只是对tableA的一次访问和tableB中的一次插入。tablemapping是桥接表吗?我刚才想说的是。因为原始表中有数百万数据,这会影响我的性能吗。虽然我还没有尝试过你的方法,并且会尽快回复你,但是“tablemapping”只是我给bridge表起的名字。为了性能,这是我唯一能找到的方法,当你的大表只需要读一次的时候。首先,很抱歉这么晚了,我最近换了工作场所。感谢您的跟进,非常感谢。当我完全按照您的查询进行操作时,它返回0行inserted。因此,我将select sequence1.nextval,ID,FieldTo更改为select sequence1.nextval,ID,type,并将a.ID=m.fieldFrom更改为a.type=m.fieldFrom,结果是所有type=BOTH都输入为| B4 | A4 | BOTH | B5 | A4 | Aa | B5 | Bb |我是否错误地查询了您的sql?