[pgsql-jp: 37597] Re: 1:n から 1:1 を抽出するSQL文
kanout @ nttdata.co.jp
kanout @ nttdata.co.jp
2006年 10月 20日 (金) 17:53:03 JST
かのうです。
SQL2で書くと、こんな感じです。
select ta.x,tb.y
from tb inner join ta
on tb.k=ta.i
where tb.j=
(select max(bq.j)
from tb as bq
where bq.k=tb.k);
ついつい気になって、確認しました。
大きいデータベースで、福島様のSQLとのEXPLAINを取っていただき、
フィードバックしていただけるとうれしいです。
# PostgreSQLのプランナがどの程度のものか知りたい。
ついでにいうと、最後の行の
where bq.k=tb.k);
を
where bq.k=ta.i);
として、アクセスプランがどうなるかも興味あります。
# 数行のデータベースじゃ、何してもインデックスを使ってくれないので。。。
---------------------------------------------------------------------
test1=# create table ta(i integer,x text);
test1=# create table tb(j integer,k integer,y text);
test1=# insert into ta values(1,'総務省');
test1=# insert into ta values(2,'金融庁');
test1=# insert into ta values(3,'防衛庁');
test1=# select * from ta;
i | x
---+--------
1 | 総務省
2 | 金融庁
3 | 防衛庁
(3 rows)
test1=# insert into tb values(1,1,'田中');
test1=# insert into tb values(2,1,'工藤');
test1=# insert into tb values(3,2,'加藤');
test1=# insert into tb values(4,2,'柴田');
test1=# insert into tb values(5,3,'青木');
test1=# insert into tb values(6,3,'新藤');
test1=# select * from tb;
j | k | y
---+---+------
1 | 1 | 田中
2 | 1 | 工藤
3 | 2 | 加藤
4 | 2 | 柴田
5 | 3 | 青木
6 | 3 | 新藤
(6 rows)
test1=# select ta.x,tb.y from tb inner join ta on tb.k=ta.i
test1-# where tb.j=(select max(bq.j) from tb as bq where bq.k=tb.k);
x | y
--------+------
総務省 | 工藤
金融庁 | 柴田
防衛庁 | 新藤
(3 rows)
> -----Original Message-----
> From: pgsql-jp-bounces @ ml.postgresql.jp
> [mailto:pgsql-jp-bounces @ ml.postgresql.jp] On Behalf Of
> FUKUSHIMA Katsuaki
> Sent: Friday, October 20, 2006 4:51 PM
> To: PostgreSQL Japanese Mailing List
> Subject: [pgsql-jp: 37593] Re: 1:n から 1:1 を抽出するSQL文
>
> 福島@現実逃避モードです。
>
> SELECT A.X, B.Y FROM A, B, (SELECT max(J) AS J, K AS I FROM B GROUP BY
> K) AS C WHERE A.I = C.I and B.J = C.J
>
> ではどうでしょう?(SQL89ですいません)
>
>
> > 今、テーブル A と B があり A:B は 1:n の関係で定義されています。具体的に
は、
> > テーブル A:
> > col I : primary key
> > col X : 会社名
> > col P : ....
> > col Q : ....
> >
> > テーブル B:
> > col J : primary key
> > col K : references A(I)
> > col Y : 会員名
> >
> > となっており、テーブル B には同一会社の複数の会員が登録されています。
> > ここで、ある条件に合致した会社名とその会社に属する会員のうち、最も
> > primary key (J) の値の大きいものを1名づつ抽出したいのですが、有効なSQL
> > 文は書けるでしょうか?
> > 期待する結果は、
> > 1. 株式会社A 山田
> > 2. 株式会社B 田中
> > 3. 有限会社C 鈴木
> >
> --
> ---------------------------------------------------------
> FUKUSHIMA Katsuaki at Seino Information Service Co., Ltd.
> e-mail kfukushima @ sis.seino.co.jp
>
pgsql-jp メーリングリストの案内