

HeidiSQL 9.4.0.5125を使い  
以下のサイトの2-4をそのままコピペし、テーブル名を `tmptreeagency` 、カラムを `name` に変更しました。  
<http://www.geocities.jp/mickindex/database/db_tree_ns.html#LocalLink-level>

そうすると、

> 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文です

[code]

    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);
    
[/code]


CC BY-SA 3.0
2017-05-10T02:20:05.990
34596
2017-05-10T05:39:43.363
2017-05-10T04:57:49.977
5793
23044
question
sql
SQLエラー(1064)について


SQLの追記ありがとうございました。ただ、今回はあなたのコピペ・編集ミスではないようで、同じSQLをPostgreSQL9.3で動かしたところ、問題なく動作しました。(データを投入していないので、元著者の意図通りかどうかまではわかりませんが、少なくともSQLエラーにはなりません。)

[SQL
Fiddle](http://sqlfiddle.com)上にてMySQL5.6でテストしたところ(HeidiSQL自体はMySQL以外にも使えるツールですので、DBとしてMySQLをお使いなのでしたら、その旨タグ等でお示しいただいた方がいいですね。エラーメッセージをきちんと見れば、わかるのはわかるのですが…)、`CAST(...
AS INTEGER)`と言う記述が構文エラーとして扱われてしまうようです。  
(yudさんの書き込みを見て、もう少し調べて修正しました。[MySQLの`CAST`では(符号付き)整数型の指定は`SIGNED
[INTEGER]`となっている](https://dev.mysql.com/doc/refman/5.6/ja/cast-
functions.html)ため、変換前の型によらず`AS SIGNED`または`AS SIGNED
INTEGER`としなければ構文エラーになると言うことでした。)

とりあえず`COUNT(*)`の結果は整数型なんだから、`CAST`は要らないだろうと言うことで、こんなSQLを作ったところMySQL5.6では動作するようになりました。ご質問中にはMySQLのバージョンが明記されておりませんので、そちらの環境ではどうなるかは断言できません(HeidiSQLを通したから動かなくなると言うのはないはずです)が、お試しください。

[code]

    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);
    
[/code]

* * *

(ちなみにこのSQLの方はPostgreSQL9.3では動きませんでした。`LPAD`がDBMS依存だと言うことはリンク先の記事に書いてありますが、細部の微妙な違いまで含めて複数のDBMSで動作するSQLを書くのは大変なようです。)


CC BY-SA 3.0
2017-05-10T05:09:59.697
34599
2017-05-10T05:39:43.363
2017-05-10T05:39:43.363
13972
13972
34596
answer


MySQLのようなので、INTEGERではなく、SIGNEDでは？  
こちらでCAST部分のみ試してみたところ、INTEGERだと構文エラーになりました。


CC BY-SA 3.0
2017-05-10T05:10:02.153
34600
2017-05-10T05:10:02.153
23048
34596
answer