- PR -

各レコード1件でテーブルを結合する

1
投稿者投稿内容
未記入
会議室デビュー日: 2007/11/09
投稿数: 3
投稿日時: 2009-01-14 17:48
Postgresで
テーブル結合を各レコード1件で行いたいのですが、どなたかご教授ください。

テーブルA  テーブルB
No Name  No Value    No Name Value
-------- --------- → ------------------
1 ああ    1  3       1 ああ 3
2 いい    1  4       2 いい 5
3 うう     2  5       3 うう 
4 ええ    4  7       4 ええ 7
という風にしたいのですが、
select A.no, A.Name, B.Value from A
left join B on A.No=B.No
とすると、No1に対して複数行出てしまうので、
TOP1みたいにvalueが小さい方を一件だけ結合したいです。
よろしくお願いします。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-01-14 17:57
実際にやってはいないですが
No と Name で GROUP BY して
Value だけ最小値を SELECT するとか。
無名tiger
常連さん
会議室デビュー日: 2008/04/18
投稿数: 36
投稿日時: 2009-01-15 10:07
King 様の回答は下記のSQLの意味と思われます。

方法1:
select
A.no, A.Name, min(B.Value)
from A left join B on A.No=B.No
group by
A.no, A.Name
order by
A.no

方法2:
select
A.no, A.Name, B1.Value
from A
left join
(select no,min(value) as value from B group by no) B1
on A.No=B1.No
order by
A.no

_________________
カスタマイズ自由自在のスタートページ。
未記入
会議室デビュー日: 2007/11/09
投稿数: 3
投稿日時: 2009-01-20 11:11
ありがとうございます。
書き忘れていたのですが、
テーブルB
No Value1 Value2  No Name Value1 Value2
---------  → ------------------
1  3   100    1 ああ 3 300
1  3   200    2 いい 5 400
1  4   300    3 うう 
2  5   400    4 ええ 7 500
4  7   500    
というようにテーブルBにはValue2があり、
このフィールドはValue1が小さい方のもの分だけsumしたいです。
しかし、select A.no, A.Name, min(B.Value1) ,sum(B.value2)
とすると、B.Value1が小さくない方のレコードも計上してしまい、100+200+300で600に
なってしまいます。
現在、方法2のような副問い合わせで、minのレコードを取得してからやっておりますが、
このようなテーブルBが複数あり、
left join (select min()) ・・・・ の多用で
長くてややこしい文になってしまっているのですが、
方法2しかないでしょうか?
一発で取れるようなもっとスマートな方法があれば教えて欲しいです。
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2009-01-20 13:15
RDBMSはPostgreSQLとのことですが、バージョンも書きましょう。

引用:

TOP1みたいに



SQL ServerやACCESSの「TOP 1」に近いものとしては、PostgreSQLではサブクエリ内でLIMIT句を使えたと思います。

LIMIT句を使った例ではないですが、SQL例を提示します。

コード:
select
  tblA.No,Name,Value1,sum(Value2) as Value2
 from tblA
  left join (select *
              from tblB as X
              where Value1=(select min(Value1)
                             from tblB
                             where X.No=No)
             ) as XX
   on tblA.No=XX.No
 group by tblA.No,Name,Value1
 order by tblA.No



引用:

現在、方法2のような副問い合わせで、minのレコードを取得してからやっておりますが、
このようなテーブルBが複数あり、
left join (select min()) ・・・・ の多用で
長くてややこしい文になってしまっているのですが、
方法2しかないでしょうか?
一発で取れるようなもっとスマートな方法があれば教えて欲しいです。



情報の小出しは、やめましょう。
回答が集まるたびに、「書き忘れ」があったりするのであれば、回答が集まらなくなりますよ?
1

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