質問: HeidiSQL 9.4.0.5125を使い 以下のサイトの2-4をそのままコピペし、テーブル名を `tmptreeagency` 、カラムを `name` に変更しました。 そうすると、 > > SQL エラー (1064): 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 INTEGER) + 1, ` `) AS name FROM tmptreeagency Mgrs, > > tmptreeagency MidMgrs, tmpt' at line 1 > > > とエラーがでます。 何度もやり直していますがエラーが直りません。 エラーの原因を教えていただけるでしょうか。 実際のSQL文です ``` SELECT LPAD(Mgrs.name, LENGTH(Mgrs.name) + CAST(COUNT(*) AS INTEGER) + 1, ' ') AS name FROM tmptreeagency Mgrs, tmptreeagency MidMgrs, tmptreeagency Workers WHERE Mgrs.lft BETWEEN MidMgrs.lft AND MidMgrs.rgt AND MidMgrs.lft BETWEEN Workers.lft AND Workers.rgt GROUP BY Mgrs.name, Mgrs.lft ORDER BY MAX(Mgrs.lft); ```
回答: SQLの追記ありがとうございました。ただ、今回はあなたのコピペ・編集ミスではないようで、同じSQLをPostgreSQL9.3で動かしたところ、問題なく動作しました。(データを投入していないので、元著者の意図通りかどうかまではわかりませんが、少なくともSQLエラーにはなりません。) SQL Fiddle上にてMySQL5.6でテストしたところ(HeidiSQL自体はMySQL以外にも使えるツールですので、DBとしてMySQLをお使いなのでしたら、その旨タグ等でお示しいただいた方がいいですね。エラーメッセージをきちんと見れば、わかるのはわかるのですが...)、`CAST(... AS INTEGER)`と言う記述が構文エラーとして扱われてしまうようです。 (yudさんの書き込みを見て、もう少し調べて修正しました。MySQLの`CAST`では(符号付き)整数型の指定は`SIGNED [INTEGER]`となっているため、変換前の型によらず`AS SIGNED`または`AS SIGNED INTEGER`としなければ構文エラーになると言うことでした。) とりあえず`COUNT(*)`の結果は整数型なんだから、`CAST`は要らないだろうと言うことで、こんなSQLを作ったところMySQL5.6では動作するようになりました。ご質問中にはMySQLのバージョンが明記されておりませんので、そちらの環境ではどうなるかは断言できません(HeidiSQLを通したから動かなくなると言うのはないはずです)が、お試しください。 ``` SELECT LPAD(Mgrs.name, LENGTH(Mgrs.name) + COUNT(*) + 1, ' ') AS name FROM tmptreeagency Mgrs, tmptreeagency MidMgrs, tmptreeagency Workers WHERE Mgrs.lft BETWEEN MidMgrs.lft AND MidMgrs.rgt AND MidMgrs.lft BETWEEN Workers.lft AND Workers.rgt GROUP BY Mgrs.name, Mgrs.lft ORDER BY MAX(Mgrs.lft); ``` (ちなみにこのSQLの方はPostgreSQL9.3では動きませんでした。`LPAD`がDBMS依存だと言うことはリンク先の記事に書いてありますが、細部の微妙な違いまで含めて複数のDBMSで動作するSQLを書くのは大変なようです。)