- PR -

PostgreSQL8:2テーブル結合問い合わせに関して

1
投稿者投稿内容
paki
会議室デビュー日: 2007/04/26
投稿数: 3
投稿日時: 2007-04-26 11:44
お世話になります。

環境はPostgreSQL8です。
対象のテーブルは以下2つです。

Table A
| cd | address | sex |
| 001| 40 | 0 |
| 002| 40 | 1 |

Table B
| cd | kbn | id |
| 001| 001 | 01 |
| 001| 001 | 02 |
| 002| 001 | 01 |

まず、AとBをA.cd=B.cdでJOINしたビューが欲しいです。
| A.cd | A.address | A.sex | B.kbn | b.id | というビューになるはずです。
もしくは、A.cdが取得できればいいです。

条件は以下です。
A.sex=0でA.address=40のレコードのうち
B.kbn=001でB.id=01
B.kbn=001でB.id=02

(数は決まっていない)

を、取得するSQLを作成したいと思ってます。

上のBに関する条件数が決まっていないのは、ユーザの入力によって変わるからです。


以下のSQLだと、Bの条件いずれかに当てはまるレコードが取れてしまいます。
ORのところをANDにすれば、取得数0になります。

SELECT *
FROM A
LEFT JOIN B ON B.cd = A.cd
WHERE A.address = 40
AND A.sex = 0
AND (
(
B.kbn = '001' AND B.id = '01'
) OR (
B.kbn = '001' AND B.id = '02'
)
:
:

)

取得方法をご教授頂ければと思っています。
宜しくお願いします。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-04-26 12:20
まず、抽出条件の意味がわからない
引用:

条件は以下です。
A.sex=0でA.address=40のレコードのうち


は分かった。

引用:

B.kbn=001でB.id=01
B.kbn=001でB.id=02

(数は決まっていない)

を、取得するSQLを作成したいと思ってます。


は、どうゆう意味?てっきり、
(B.kbn=001でB.id=01)
または、(B.kbn=001でB.id=02)
または、....
かと思ったが、
引用:

以下のSQLだと、Bの条件いずれかに当てはまるレコードが取れてしまいます。
ORのところをANDにすれば、取得数0になります。


ということなので、違うらしいし。

もう少し、やりたいことを明確に記述してください。
paki
会議室デビュー日: 2007/04/26
投稿数: 3
投稿日時: 2007-04-26 12:34
説明の仕方がおかしかったようで。申し訳ないです。

Bの条件として
(kbn=001でcd=01)(kbn=001でcd=02)
とあった場合に、取得したい検索結果は
| A.cd |
| 001 |
です。

また、
(kbn=001でcd=01)
とあった場合に、取得したい検索結果は
| A.cd |
| 001 |
| 002 |
です。

という説明はどうでしょうか?
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-04-26 23:40
提示されたデータについて、A.cd = B.cd結合した結果は
| A.cd | A.address | B,sex | B.cd | B.kbn | B.id |
-----------+-------------+---------+---------+------------+----------+-
| 001 | 40 | 0 | 001 | 001 | 01 |
| 001 | 40 | 0 | 001 | 001 | 02 |
| 002 | 40 | 1 | 002 | 001 | 01 |
となる。

再度説明をいただいた結果を書き出すと
(kbn=001でcd=01)の場合
| A.cd | A.address | B,sex | B.kbn | B.id |
----------+-------------+---------+------------+----------+-
| 001 | 40 | 0 | 001 | 01 |
| 002 | 40 | 1 | 001 | 01 |
の2行。
即ち、
| A.cd |
----------+
| 001 |
| 002 |
を取得したい。

(kbn=001でcd=01)(kbn=001でcd=02) の場合
先ほどの2行と、

(kbn=001でcd=02)の場合の
| A.cd | A.address | B,sex | B.kbn | B.id |
----------+-------------+---------+------------+----------+-
| 001 | 40 | 0 | 001 | 02 |

との間で、A.cdが同じ結果である
| A.cd |
----------+
| 001 |
が欲しいてことでOK?

であれば、

コード:
SELECT  A.cd FROM A
JOIN B ON B.cd = A.cd 
where
     B.kbn = '001' AND B.id = '01'

intersect

SELECT  A.cd FROM A
JOIN B ON B.cd = A.cd 
where
    B.kbn = '001' AND B.id = '02' 

(以下好きなだけ続く...)



で、とれると思う。
今動かせる環境が無いので未確認だけど。
paki
会議室デビュー日: 2007/04/26
投稿数: 3
投稿日時: 2007-04-27 09:28
お世話になります。

細かい説明ありがとうございます。
intersectで繋げてみた所、期待する結果が取得出来ました。

どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)