社員ブログ
HOME  社員ブログ
ホーム > Oracle, データベース, 社員:モンク, 開発言語, 雑記 > .net修行中35(外部結合表の条件はJOIN句かWHERE句か)

.net修行中35(外部結合表の条件はJOIN句かWHERE句か)

2013年07月18日 0時00分29秒

こんにちは、モンクです。

.NETとは全然関係のないことを書いてしまいます。

以下のような表があるとします。

<br />
SQL&gt; select * from tab_x;</p>
<p>     COLX1<br />
----------<br />
         2<br />
         4<br />
         6</p>
<p>SQL&gt; select * from tab_y</p>
<p>     COLY1      COLY2<br />
---------- ----------<br />
         2         20<br />
         4         40<br />
         6         60</p>
<p>


例題
TAB_Xの行全部とTAB_YのCOLY1が2である行を検索したいとします。
ところがCOLY1が2のデータはありませんので、COLX1の全行のみ返されることを期待するわけです。
期待どおりの結果をもどすSELECT分は以下のどちらでしょうか。

A.
SELECT X.COLX1,
Y.COLY1,
Y.COLY2
FROM TAB_X X LEFT JOIN TAB_Y Y ON Y.COLY1 = X.COLX1
WHERE Y.COLY2 = 1;

B.
SELECT X.COLX1,
Y.COLY1,
Y.COLY2
FROM TAB_X X LEFT JOIN TAB_Y Y ON Y.COLY1 = X.COLX1 AND Y.COLY2 = 1;

正当はBです。

<br />
SQL&gt; SELECT X.COLX1,<br />
  2         Y.COLY1,<br />
  3         Y.COLY2<br />
  4    FROM TAB_X X LEFT JOIN TAB_Y Y ON Y.COLY1 = X.COLX1<br />
  5  WHERE Y.COLY2 = 1;</p>
<p>レコードが選択されませんでした。</p>
<p>SQL&gt; SELECT X.COLX1,<br />
  2         Y.COLY1,<br />
  3         Y.COLY2<br />
  4    FROM TAB_X X LEFT JOIN TAB_Y Y ON Y.COLY1 = X.COLX1 AND Y.COLY2 = 1;</p>
<p>     COLX1      COLY1      COLY2<br />
---------- ---------- ----------<br />
         6<br />
         4<br />
         2<br />


上記Aの場合「TAB_YにあるCOLY2=2の行だけに絞った後、外部結合をしろ」という解釈のようです。
上記Bの場合「TAB_YにあるCOLY2=2の行を外部結合をしろ」という解釈のようです。

一見すると、どう解釈が違うのかわからないですが、JOIN句とWHERE句を理解し、目的に応じて使い分けましょう。

Oracle, データベース, 社員:モンク, 開発言語, 雑記

  1. コメントはまだありません
  1. トラックバックはまだありません