- 未記入
- 会議室デビュー日: 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とのことですが、バージョンも書きましょう。
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しかないでしょうか?
一発で取れるようなもっとスマートな方法があれば教えて欲しいです。
|
情報の小出しは、やめましょう。
回答が集まるたびに、「書き忘れ」があったりするのであれば、回答が集まらなくなりますよ?
|