外部結合について

ITコーディネータのシュウです。

埼玉古墳__

映画「のぼうの城」で有名な忍城のある埼玉県行田市にあります、さきたま古墳に行ってきました。前方後円墳8基と円墳1基の5~7世紀ごろの大型古墳が残る、全国有数の大型古墳群です。写真は、直径105m、高さ約19mの日本最大の円墳である丸墓山古墳の頂上から見た稲荷山古墳です。

ところで、ここのところ、大手通信教育の会社の個人情報漏えい事件、マレーシア航空機の撃墜事件、中国の食品会社の使用期限切れ食肉使用問題、イスラエルとパレスチナの紛争など、様々な事件や問題が世界中で起きていることを感じます。

個人情報漏洩の件では、私も以前、協力会社のSEとして、ある大手会社の個人情報を扱う立場にいたこともありましたが、そこでは定期的に協力会社の社員にも個人情報に関する教育やWEBでのテストなどを実施して、危機意識を高める努力をしていたこともありますし、何か起きたときに真っ先に疑われるのが協力会社のSEということも感じていたので、とても注意して作業をしていました。

2003年に成立し、2005年から施工された個人情報保護法が、ビッグデータの利活用に関連して来年には改正される方向ですが、今回の件も考慮したかたちでの対応が必要と思われますね。

うちの子供もまさに今回問題となった通信教育を受けていて、名簿を買ったといわれる企業から急にDMが届いたので、何で急に?と不思議に思ったのを覚えています。
しかし、成人式が近い子供の振袖の宣伝やら、高校卒業が近い子供への各種専門学校からのDM、その他塾や通信教育の宣伝、本当にたくさんのDMが日々送られてきますね。どこの会社も頑張っているのはわかるのですが。
ときに、DMを包んでいるプラスチックゴミの分別など、手間がかかるなと感じてしまう私でした。

<本日の題材>
外部結合について

SELECT文で、複数のテーブルを結合して結果を出す場合に、ある条件で、両方のテーブルに一致する値を持つレコードだけでなく、一方のテーブルにしかないレコードも一緒に表示させたいケースも結構あります。今回は、外部結合についてちょこっと再確認してみます。

外部結合の種類と構文:
1.左外部結合: LEFT [OUTER] JOIN
SELECT .., .., ..
FROM テーブルA LEFT [OUTER] JOIN テーブルB
ON テーブルA.列名 = テーブルB.列名

左側の表(テーブルA)の内容を全て抽出し、右側の表(テーブルB)は  条件で一致するレコードのみを表示します。

2.右外部結合: RIGHT [OUTER] JOIN
SELECT .., .., ..
FROM テーブルA RIGHT [OUTER] JOIN テーブルB
ON テーブルA.列名 = テーブルB.列名

右側の表(テーブルB)の内容を全て抽出し、左側の表(テーブルA)は  条件で一致するレコードのみを表示します。

3.完全外部結合: FULL [OUTER] JOIN
SELECT .., .., ..
FROM テーブルA FULL [OUTER] JOIN テーブルB
ON テーブルA.列名 = テーブルB.列名

左側の表(テーブルA)、右側の表(テーブルB)とも条件に一致しない  レコードも含めてすべて表示します。

例)よくある例としては、EMP表(従業員表)とDEPT表(部署表)があって、DEPTNOという部署コードが2つのテーブルをジョインするキーとなっている場合で、従業員と所属部署の一覧を見たいというときに外部結合を使用する例です。このとき、新しい従業員を雇ったのでEMP表にデータを登録するのですが、所属部署は設定せず、後から決めるというときに、その時点での一覧を見ると通常の結合(内部結合)では部署コードのない新入社員が抽出されないため、以下のように外部結合で抽出します。

新入社員の登録:
INSERT INTO EMP(empno,ename,hiredate) VALUES(8000,'SATOU','2014-07-20');

従業員と所属部署の一覧:
SELECT E.empno, E.ename, E.job, D.dname, D.deptno
FROM emp E
LEFT OUTER JOIN dept D ON E.deptno = D.deptno
ORDER BY E.empno;

外部結合1

上記は左外部結合ですが、これを右外部結合で表すと、
SELECT E.empno, E.ename, E.job, D.dname, D.deptno
FROM dept D
RIGHT OUTER JOIN emp E ON D.deptno = E.deptno
ORDER BY E.empno;

外部結合2

さらに、完全外部結合で表すと、DEPT表には存在するが、EMP表ではその部署コードを持つ従業員が存在しない部署も表示されます。
SELECT E.empno, E.ename, E.job, D.dname, D.deptno
FROM emp E
FULL OUTER JOIN dept D ON E.deptno = D.deptno
ORDER BY E.empno;

完全外部結合

今回はOracleを中心に確認しました。
今日は以上まで

にほんブログ村 IT技術ブログへ
にほんブログ村

SELECTのCASE句について

ITコーディネータのシュウです。

1402143552101

たまにはITコーディネータについての情報もあったほうがいいかと思い、ITコーディネータ協会のHPから気づいた点を報告します。結構HPもリニューアルしていますね。

それで、1年以上前からイノベーションが創出できる次世代高度IT人材の育成について、独立行政法人情報処理推進機構(IPA)と共同で呼びかけ「IT融合人材育成連絡会」を立ち上げていました。そして「IT融合人材」の具体的な育成と組織のあり方についての検討成果についての最終報告書がホームページで公開されているようです。
http://www.itc.or.jp/news/inv20140325.html

イノベーションを創出できる人材を、あるプロセスに従うことで効果的に育成できれば?日本の将来にとっても本当に大きいことですよね。頑張れニッポン!

<本日の題材>
SELECTのCASE句について

今回は、最近システムを作り込むときに確認した内容で、SELECT文で複数の条件でのそれぞれの件数の結果を1つのSQLで実施する際に、CASE句を利用したケースについて記載します。(ORACLEです)

例)あるテーブル(受注実績テーブルとします)のデータで、あるフラグ(判定フラグとします)に「1」が立っているものと「0」のもの、及び全体の合計件数を抽出する。

SELECT
受注年月
, COUNT(CASE 判定フラグ WHEN '1' THEN 1 ELSE NULL END) AS 判定有
, COUNT(CASE 判定フラグ WHEN '0' THEN 1 ELSE NULL END) AS 判定無
, COUNT(*) 合計件数
FROM 受注実績
GROUP BY 受注年月
ORDER BY 受注年月;

oracle_case_1

他の方法としては、インラインビューを使用して下記のように行うこともできます。

SELECT
受注実績1.年月
, 受注実績1.件数 判定有
, 受注実績2.件数 判定無
, 受注実績3.件数 合計件数
FROM
(SELECT 受注年月, COUNT(*) 件数 FROM 受注実績
WHERE 判定フラグ = '1'
GROUP BY 受注年月) 受注実績1
, (SELECT 受注年月, COUNT(*) 件数 FROM 受注実績
WHERE 判定フラグ = '0'
GROUP BY 受注年月) 受注実績2
, (SELECT 受注年月, COUNT(*) 件数 FROM 受注実績
GROUP BY 受注年月) 受注実績3
WHERE 受注実績1.受注年月 = 受注実績2.受注年月
AND 受注実績1.受注年月 = 受注実績3.受注年月
ORDER BY 受注実績1.受注年月;

oracle_case_2

 

でも、CASE句を使って抽出したほうが簡単ですね。
CASE文はいろいろなところで使用できますが、1つの例としてあげました。

今日は以上まで

にほんブログ村 IT技術ブログへ
にほんブログ村