##前書
prepared statementなのに値によってsyntax errorが出て混乱したのでメモ
##現象
全く関係ない二列に同じ値を設定するとDuplicate column nameが発生する
-- 実行出来る
select
'abc'
, 'abc';
-- 実行出来る
select
*
from
(
select
'abc'
, 'xyz'
) as temp;
-- 実行出来ない
select
*
from
(
select
'abc'
, 'abc'
) as temp;
※リテラル部分は実際にはprepared statementから指定して実行した
##対処法
ASを使用し列名を設定する
dual表を使用する
-- 実行出来る
select
*
from
(
select
'abc' as c1
, 'abc' as c2
) as temp;
-- 多分これが一番正しい
select
'abc'
, 'abc'
from
dual;
-- 次点
select
'abc'
, 'abc'
from
(
select
1
) as temp;
※リテラル部分は実際にはprepared statementから指定して実行した
##因みに
なんでこんな構成が出現したのかというと、insert into valuesにwhere条件を付けたくてinsert into selectに変換
その際from句が必要になったため
MySQLにdualがある(互換性のためらしい)ことを知っていればこんなことには