Pages

2017年3月7日火曜日

外部結合のON句による条件付と、グループ内の最小値データの取得について

こんにちは。まるで知識が追いついていない入社そろそろ2年目です。

初めての今回は、SQL文の外部結合におけるON句による条件付についてと、グループ内の最小値データの取得についてです。

まず、SQL文の外部結合におけるON句による条件付について学んだことを記録します。

これまでは、例えば

SELECT A.id, B.name FROM TABLE.A LEFT OUTER JOIN TABLE-B B ON A.id = B.a_id  WHERE B.score > 75;

のような設定をしていたのですが、これは結合された結果に対しての条件指定であり、内部結合と同じような動きになってしまうようです。そのため、「B.score > 75」の条件が偽の場合は「TABLE-B」表からの情報がNULL値になるだけでなく、「TABLE.A」表の情報も表示されなくなってしまうようです。

一方で、下のようにON句に書く場合は、「TABLE-B」表の中で条件付を行い、「B.score > 75」の条件が偽の場合は「TABLE-B」表から取得する情報がNULLになるだけでTABLE.A」表の情報は表示できるようです。

SELECT A.id, B.name FROM TABLE.A LEFT OUTER JOIN TABLE-B B ON A.id = B.a_id  AND B.score > 75;

次に、グループ内の最小値データの取得について学んだことを記録します。

例えば、次のような表が2つあるとします。

TABLE FRUIT
ID   |KIND
ーーーーーーーーーーー
1   |りんご
ーーーーーーーーーーー
2   |みかん

TABLE SALE
ID   |FRUIT_ID |PRICE
ーーーーーーーーーーーーーーーーーー
1   |1     |100
ーーーーーーーーーーーーーーーーーー
2   |1     |120
ーーーーーーーーーーーーーーーーーー
3   |2     |250
ーーーーーーーーーーーーーーーーーー
4   |1     |110
ーーーーーーーーーーーーーーーーーー
5   |2     |200

「SALE」表から、りんごとみかんの価格の最小値を行を表示させます。
SELECT * FROM sale WHERE price IN (SELECT MIN(price) FROM sale GROUP BY fruit_id);
こうすると、以下のように表示できます。

TABLE SALE
ID   |FRUIT_ID |PRICE
ーーーーーーーーーーーーーーーーーー
1   |1     |100
ーーーーーーーーーーーーーーーーーー
5   |2     |200

WHERE句から価格をINで「果物のIDとグループ化した価格の最小値を表示するSELECT文」とつなげることにより、果物ごとの価格の最小値の行を取得できました。

これを、「FRUIT」表と上と同様ON句から外部結合してみます。

SELECT F.id F.kind S.price FROM fruit F LEFT OUTER JOIN SALE S ON  F.id = S.fruit_id AND S.price IN (SELECT MIN(price) FROM sale GROUP BY fruit_id);

こうすると、以下のように表示できます。

ID   |KIND |PRICE
ーーーーーーーーーーーーー
1   |りんご |100
ーーーーーーーーーーーーー
2   |みかん |200

このように果物の種類ごとに最小価格がわかるようになります。

連結する相手側の最大、最小値を取得するには、このようにグループ化したSELECT文を利用するようです。

0 件のコメント:

コメントを投稿