1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

INSERT SELECTでWITHを利用したい

Last updated at Posted at 2021-03-02

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
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?