89562


以下のようなテーブルデータがそれぞれあるとします。

テーブルA

id | data | type  
---|---|---  
1 | aaa | a  
2 | bbb | a  
3 | ccc | a  
4 | ddd | b  
5 | eee | b  
  
テーブルB

id | data  
---|---  
1 | xxx  
2 | yyy  
  
* * *

テーブルAから、例えば以下のようにセレクトし、その結果をテーブルBにインサートして以下の結果のようにしたいです。

１回のSQL文で実現可能でしょうか？  
実現可能ならどのようにSQL文を書けばよいでしょうか？

[code]

    select data from A where type = 'a'
    
[/code]

テーブルB (インサート後)

id | data  
---|---  
1 | xxx  
2 | yyy  
3 | aaa  
4 | bbb  
5 | ccc


CC BY-SA 4.0
2022-06-23T06:11:13.490
89544
2022-06-23T20:33:51.753
2022-06-23T07:31:11.923
3060
18637
question
sql
テーブルAからselectした結果を元に複数件データをテーブルBにinsertする


テーブルBのidに続けて連番を振る目的ならば、MySQL 8.0以上であれば下記のSQLで実現可能です。  
(連番を作成するSQLはデータベースによって変わります)

[code]

    insert into B select ROW_NUMBER() OVER (ORDER BY id) + (select COUNT(1) from B), data from A where type = 'a';
    
[/code]

[DB Fiddle](https://www.db-fiddle.com/f/huX9CKSuvqVH6qbjTvq8M7/0)


CC BY-SA 4.0
2022-06-23T09:55:12.613
89551
2022-06-23T09:55:12.613
9820
89544
answer


コメントで触れましたが、`id`列の採番を`INSERT`する側に委ねるのではなく、テーブルが（テーブル定義として）責任を持つべきです。具体的には大抵のSQLには`AUTO_INCREMENT`のような機能が用意されています。  
（payanecoさんに続く意味でMySQLで書きます。）

テーブルBの定義が

[code]

    create table B (id integer AUTO_INCREMENT, data varchar(10), INDEX (id));
    
[/code]

となっていれば、`INSERT`する側は`id`列に`NULL`を与えるだけで済みます。

[code]

    insert into B select NULL, data from A where type = 'a';
    
[/code]


CC BY-SA 4.0
2022-06-23T20:33:51.753
89562
2022-06-23T20:33:51.753
4236
89544
answer