こんにちは。まるで知識が追いついていない入社そろそろ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 件のコメント:
コメントを投稿