[Oracle] Oracle の ANSI JOIN は信用しきれない!? | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

SQL でテーブルを結合する際、FROM 句に結合するテーブルを並べて書き、WHERE 句に結合条件を書くという旧来の構文を使う人はいまだに多いようです。


特定の RDBMS しか使わないプログラマや古株のプログラマに特にその傾向が多く見られるような気がします。

SELECT E.ENAME, D.DNAME
	FROM EMP E, DEPT D
	WHERE E.DEPTNO = D.DEPTNO;

しかし、複数の RDBMS を操るプログラマや標準化好きなプログラマなど、ANSI 標準 の JOIN 句を積極的に使うように心掛けている人も結構多くなっているのではないでしょうか。

SELECT E.ENAME, D.DNAME
	FROM EMP E
	INNER JOIN DEPT D
		ON E.DEPTNO = D.DEPTNO;


この構文だと、どの RDBMS でも基本的に同じように SQL を記述でき、どのような結合を行っているのかもわかりやすいので、私もここ数年の間に ANSI JOINを使うよう完全に切り替えました。

しかし...一抹の不安もあります。

各 RDBMS ベンダーが ANSI 標準に準拠し始めたのは昨日今日の話ではないのですが、それでもまだ信頼性という部分で疑問符が残っているからです。

詳しくは書けませんが、Oracleのサポート情報を見ていると ANSI JOIN がらみのバグが結構発生しています。


特に OUTER JOIN のバグが多いようです。

さらにその回避策としてさり気に「ANSI JOIN ではなく、(+)を使用した外部結合に置き換えて実行して下さい。」などと書かれていたりするから困ったものです^^;

もっとも、パッチリリースを重ねるごとにこういったバグは解消されてきてはいるようなのですが、「だからベンダー固有の構文で書いたほうがいい。」なんていう人が出てこないよう、もうちょっと頑張ってほしいものですね。