« 20090607 | メイン | Seasar Conference Spring 2009 »

2009年6月13日

なんか気持ちわるーいSQL

テーブルAにはhoge_codeがあり、テーブルBにはhoge_code, fuga_code, hoge_nameがあります。テーブルAにfuga_cdはありません。

この2つのテーブルを外部結合してhoge_codeとhoge_nameのデータをげっとしたいです(外部結合なんで、テーブルBにデータが無くてもテーブルAのデータだけはげっとします)、っていうことをやる機能があって、担当の人は

select A.hoge_code, B.hoge_name
from A, B
where A.hoge_code = B.hoge_cd
and B.fuga_code = ?

こんな感じのSQL文を書いてたんですけど、レビューの時に最後の行を

and ? = B.fuga_code(+)

に修正するように言われてました。この記述がなんか気持ちわるーいんですよねぇ。で、その担当の人は「なんでこんな書き方しなきゃいけないの?」とうちに聞いてきました。

うちも最初はそう思いました。前にどっかの記事で「hogehoge(+) = ?は意味の無い記述だ!」ってのを見たことがあったので、そんな記述をして意味があるのか?と思ってしまいました。

でも、よく考えてみると、「B.fuga_code = ?」だとテーブルAにデータがあってテーブルBにデータがない場合に何もげっとできません。なので、この指摘は正しいんですけどー。

・?が前に来るのはなんかイヤ
・where句に書くと抽出条件なのか結合条件なのかわかりにくい
・データを残さないテーブルの方に(+)を付けるっていうのがなんかおかしい気がする
・(+)はora方言だから使いたくない

こんな感じで、うちは↑の指摘後の記述が好きじゃないです。「DBMSはoraだけしか触らないんだ!!!」って人だけがああいう書き方をすれば良いと思ってます。

うちが担当者だったらleft outer joinを使うでしょう。でも、今回のプロジェクトでは外部結合演算子を使わなきゃいけないという制限が・・・。

投稿者 txdrum : 2009年6月13日 01:53