こんにちは。
田中です。
今回はPostgreSQLのCTE(Common Table Expression)について書いていこうと思います。
MySQLで見た、1000行超えるSQLに啞然
数年前の案件である。
当時PHPで作成されたシステムをJavaへ刷新する、というプロジェクトに参画していたのだが、当時の設計書がない、当時の担当者もいない(委託だったらしくさもありなん)、仕様はソースを解析するしかないという状況。
別にこの状態自体は珍しくもなんともない。
むしろ、今までまともな設計書が残っていたケースのほうが少ないので驚くところではない。
そこでSQLを開いてみたところ…
―FROM分に()があってSELECT文が続いている、だと…!
FROMに指定されているSELECT文が1つならまぁいい。
問題は、中のSELECT文のFROMにまたSELECT文が続いていることなのだ…!
下手すると4重、5重重なっているうえに、JOINも多いだと…!
なんだこれ、ややこしい!!
そりゃあ、1000行余裕で超えるでしょうよ!
と解析の大変さに震えた。
この場合、何が大変かと言えば、もちろん1つ1つのSELECT文が何を取得しているか、と読み解いていく必要があるからだ。
シンプルに1つのテーブルから取得する内容であれば、解読に時間はかからないが、JOIN系が入ったりするとその文難度は上がる。
結局当時は、SELECT文1つ1つを見ては資料に起こして仕様を確認した。
PostgreSQLのCTEとは