0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MySQLアップデートによるUNIONとINTO OUTFILE S3で生じたエラー解決

Posted at

前提: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を実施する上で参考にしたサイト

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?