前提:SQLで行いたいこと
AWSのAurora MySQLを利用。Aurora2から3へアップデートの調査中に発生
SQLで実現したかったことは、
項目名にデータが並ぶようにしつつ、並び替えて、S3のtestバケットに以下のtestを出力
CSVの項目名1,CSVの項目名2,
データA1,データA2,
データB1,データB2,
データC1,データC2,
以下略
SQL文A
SELECT "CSVの項目名1","CSVの項目名2" UNION ALL (
SELECT `テーブル名`.`カラム1`,`テーブル名`.`カラム2`
FROM `テーブル名`
WHERE `テーブル名`.`テストID` = サンプルID
GROUP BY `テーブル名`.`カラム1`
ORDER BY `テーブル名`.`ID` ASC
LIMIT 1000
OFFSET 0
INTO OUTFILE S3
's3://test/test'
);
問題1:SQL構文エラー
ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near 'INTO OUTFILE S3
INTO OUTFILE S3 に関して構文エラーが発生
問題1を解決したSQL文B
UNION ALLにかかっている ")" の位置を変更
SELECT "CSVの項目名1","CSVの項目名2" UNION ALL (
SELECT `テーブル名`.`カラム1`,`テーブル名`.`カラム2`
FROM `テーブル名`
WHERE `テーブル名`.`テストID` = サンプルID
GROUP BY `テーブル名`.`カラム1`
ORDER BY `テーブル名`.`ID` ASC
LIMIT 1000
OFFSET 0
)
INTO OUTFILE S3
's3://test/test'
;
MySQL8では通るが、MySQL5ではエラー発生
問題2:特定列でデータの値が同一になる
理想
CSVの項目名1,CSVの項目名2,
データA1,データA2,
データB1,データB2,
データC1,データC2,
問題
CSVの項目名1,CSVの項目名2,
データA1,データA2,
データB1,データA2,
データC1,データA2,
最終的な解決としたSQL文C
対処としてUNION ALLからUNIONに変更
SELECT "CSVの項目名1","CSVの項目名2" UNION (
SELECT `テーブル名`.`カラム1`,`テーブル名`.`カラム2`
FROM `テーブル名`
WHERE `テーブル名`.`テストID` = サンプルID
GROUP BY `テーブル名`.`カラム1`
ORDER BY `テーブル名`.`ID` ASC
LIMIT 1000
OFFSET 0
)
INTO OUTFILE S3
's3://test/test'
;
MySQL8では通るが、MySQL5ではエラー発生
何が問題となっていたか
-
問題1
-
https://dev.mysql.com/doc/refman/8.0/ja/union.html
- 最後の SELECT ステートメントのみが INTO 句を使用できます。 ただし、UNION の結果全体が INTO 出力先に書き込まれます。
- クエリー式のカッコで囲まれた後続ブロックでは、INTO を (FROM に対する相対位置に関係なく) 使用すると警告が生成されます。
例:
... UNION (SELECT * INTO OUTFILE 'file_name' FROM table_name);
-
SQL文Aだと()内の内容をファイル出力後にUNION ALLで接続してしまう構文エラーが発生したと考えられます。
-
-
問題2
- 原因ははっきりとしないです。
- 動作として問題に関係があったのがUNIONとLIMIT,OFFSETでした。
SELECT `テーブル名`.`カラム1`,`テーブル名`.`カラム2` FROM `テーブル名` WHERE `テーブル名`.`テストID` = サンプルID GROUP BY `テーブル名`.`カラム1` ORDER BY `テーブル名`.`ID` ASC LIMIT 1000 OFFSET 0
は問題なく動作するものの、UNION ALLとして結合を行うと問題が発生しました。
UNIONとUNION ALLの処理の違いとしては結合の際に前者は重複削除・後者は重複を許します。
参考資料
問題解決の参考にしたサイト
実際にSQLを実施する上で参考にしたサイト