プロが教える店舗&オフィスのセキュリティ対策術

2つのテーブル(basecodeとaddcode)からVIEWを作りたいのですが、
そのVIEWについてご教授いただきたく。


<TABLE名:basecode>
----------------------
no name area code
----------------------
1 aaaa 2 102
2 bbbb 4 103
3 cccc 4 203
4 gggg 3 303
5 eeee 3 101
6 ffff 5 104
7 hhhh 1 115
----------------------


<TABLE名:addcode>
-----------------------------------------
base anum bnum cnum dnum dmy no
-----------------------------------------
bbbb 1 1 1 1 aaa 2
cccc 12 13 10 2 aaa 3
cccc 12 13 10 0 aaa 3
cccc 12 13 10 5 aaa 3
dddd 12 15 3 1 aaa 3
dddd 12 15 3 3 aaa 3
dddd 12 15 3 4 aaa 3
eeee 10 3 12 1 aaa 5
eeee 10 3 12 2 aaa 5
eeee 10 3 12 3 aaa 5
eeee 10 3 12 4 aaa 5
eeee 13 12 15 3 aaa 5
eeee 13 12 15 0 aaa 5
eeee 13 12 15 1 aaa 5
eeee 13 12 15 2 aaa 5
hhhh 4 3 11 0 aaa 7
hhhh 4 3 11 2 aaa 7
hhhh 4 3 13 2 aaa 7
kkkk 0 0 0 0 aaa 9
-----------------------------------------


VIEWの抽出は以下の通り。
 basecodeのno
 basecodeのname
 basecodeのcode
 addcodeのbase
 addcodeのanum
 addcodeのbnum
 addcodeのcnum
 addcodeのdnum

VIEWの作成条件としては以下の通り。
<条件>
TABLE名:basecodeとaddcodeのnoが存在し、かつ、
baseaddのnoが複数あり、baseが同じものは以下で判断
 ・anumとbnumとcnumが同一であればその中のdnumが最小であるレコードを抽出
 ・anumとbnumとcnumが異なれば別々に抽出

上記より、以下のように抽出したい。

<TABLE名:basecodeview>
-----------------------------------------------
no name code base anum bnum cnum dnum
-----------------------------------------------
2 bbbb 103 bbbb 1 1 1 1
3 cccc 203 cccc 12 13 10 0
3 cccc 203 dddd 12 15 3 1
5 eeee 101 eeee 10 3 12 1
5 eeee 101 eeee 13 12 15 0
7 hhhh 115 hhhh 4 3 11 0
7 hhhh 115 hhhh 4 3 13 2
-----------------------------------------------


よろしくお願いします。

A 回答 (2件)

下記の様に考えてよいでしょうか?



・basecode の no はユニーク
・basecode と addcode は no が同じ行を結合

そうであれば、no をキーに結合し、dnum 以外の出力項目でグループ化する SQL を VIEW にすれば良いかと。

例) ------------------------------------
CREATE VIEW hoge AS
SELECT
bc.no,
bc.name,
bc.code,
ac.base,
ac.anum,
ac.bnum,
ac.cnum,
MIN(ac.dnum)
FROM
basecode bc INNER JOIN addcode ac USING(no)
GROUP BY bc.no, bc.name, bc.code, ac.base, ac.anum, ac.bnum, ac.cnum
ORDER BY bc.no, ac.base -- ソートする必要が無ければこの行は除去
;
----------------------------------------

この回答への補足

すみません。
再度確認ですが、上記のSQLでanumとbnumとcnumが同一の時は
最小のdnumのみ抽出されるということでよろしいでしょうか。

補足日時:2012/04/30 09:50
    • good
    • 0
この回答へのお礼

考え方はあっています。
まだ確認はできていませんが後日試してみます。

ありがとうございます。

お礼日時:2012/04/29 23:13

> 上記のSQLでanumとbnumとcnumが同一の時は


> 最小のdnumのみ抽出されるということでよろしいでしょうか。

baseが同一のものの中であれば、そうなります。
ただし、 base anum bnum cnum が同じでも no が違えば別々に出力されますが、恐らくそれは問題ない動作ではないのでしょうか?
少なくとも、ご質問に例示されているデータについては例示されている通りの結果が抽出されます。


VIEW定義内のSELECT文は、特に難しい事をやっている訳ではないので、ご自身で精査されると良いと思います。

1. 2つのテーブルを no が同じもので内部結合
 同じ値の no が両テーブルに存在するものだけが、取り出されます。
 http://www.techscore.com/tech/sql/SQL6/06_02.html/

2. 1で取り出されたデータを no name code base anum bnum cnum でグループ化
 つまり最終的な出力項目の内の dnum 以外全てが同じものごとに一まとめにしています。
 http://www.techscore.com/tech/sql/SQL5/05_08.html/

3. 2のデータから no name code base anum bnum cnum と dnum の最小値を出力
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す