TL;DR
MySQL8で、INSERT SELECTでWITHを利用したい場合、以下のように書けばよいです。
INSERT INTO a (
WITH c AS (
SELECT * FROM b
)
SELECT * FROM c
);
WITH RECURSIVE (再帰SQL) も利用することができます。
INSERT INTO e (
WITH RECURSIVE r AS (
SELECT 1 AS seq
UNION ALL
SELECT seq + 1 FROM r WHERE seq < 5
)
SELECT * FROM r
);
環境
mysql Ver 8.0.23 for Linux on x86_64 (MySQL Community Server - GPL)
稼働確認用DDL
WITH
CREATE TABLE a (
col text
);
CREATE TABLE b (
col text
);
INSERT INTO b VALUES ('col1');
INSERT INTO b VALUES ('col2');
INSERT INTO b VALUES ('col3');
INSERT INTO b VALUES ('col4');
INSERT INTO b VALUES ('col5');
INSERT INTO a (
WITH c AS (
SELECT * FROM b
)
SELECT * FROM c
);
SELECT * FROM a;
このSQLが以下のような結果セットを返すことを確認する。
col |
---|
col1 |
col2 |
col3 |
col4 |
col5 |
WITH RECURSIVE
CREATE TABLE e (
seq INT
);
INSERT INTO e (
WITH RECURSIVE r AS (
SELECT 1 AS seq
UNION ALL
SELECT seq + 1 FROM r WHERE seq < 5
)
SELECT * FROM r
);
SELECT * FROM e;
このSQLが以下のような結果セットを返すことを確認する。
seq |
---|
1 |
2 |
3 |
4 |
5 |