[pgsql-jp: 36814] Re: WHERE に SELECT ふたつ
海北 龍一
kaihou100 @ yahoo.co.jp
2006年 3月 3日 (金) 16:50:54 JST
海北と申します。
このようなクエリはいかがでしょう?
UPDATE t1
SET f3=10
FROM t2
WHERE t1.f1 = t2.f1
AND t1.f2 = t2.f2
AND t2.f5='a02'
;
--- 河本陽一 <komoto.yoichi @ kcc.co.jp> からのメッセージ
:
> こうもとです。
>
> WHEREにふたつのSELECTの結果を渡そうとしています。
>
> 例)
> # UPDATE t1 SET f3=10 FROM t1 WHERE f1=(SELECT f1
> FROM t2 WHERE
> f5='a02') AND f2=(SELECT f2 FROM t2 WHERE f5='a02');
>
> これでは効率が悪いと思うので、SELECTを1回で済ます方
法はないでしょ
> うか。
>
> 複数のフィールド(t1.f1,t1.f2)がプライマリキーとなっ
ているテーブル
> (t1)のフィールド(t1.f3)を、別のテーブル(t2)の条件(t2.f5)
を元に変更し
> ようとしています。
> 変更するときはt2、参照するときはt1を使用したいと思い
ます。
> t2テーブルのフィールドに、t1.f3を参照する仮想フィー
ルドみたいなの
> があるとよいと思っているのですが、そいうのはあるのでし
ょうか。
>
> #DBは、PostgreSQL 7.4.7 を使用しています。
>
>
> ●データ構造
> # \d t1
> Table "public.t1"
> Column | Type | Modifiers
> --------+---------+-----------
> f1 | integer | not null
> f2 | integer | not null
> f3 | integer |
> Indexes:
> "t1_pkey" primary key, btree (f1, f2)
>
> # \d t2
> Table "public.t2"
> Column | Type | Modifiers
> --------+---------+-----------
> f1 | integer | not null
> f2 | integer | not null
> f4 | integer | not null
> f5 | text |
> Indexes:
> "t2_pkey" primary key, btree (f1, f2, f4)
> "t2_f5_key" unique, btree (f5)
> Foreign-key constraints:
> "$1" FOREIGN KEY (f1, f2) REFERENCES t1(f1, f2)
>
>
> ●データ
> # SELECT * from t1;
> f1 | f2 | f3
> ----+----+----
> 1 | 2 | 0
> 1 | 3 | 1
> 2 | 2 | 2
> 2 | 3 | 3
> (3 rows)
>
> # SELECT * from t2;
> f1 | f2 | f4 | f5
> ----+----+----+-----
> 1 | 2 | 5 | a01
> 1 | 3 | 6 | a02
> 2 | 2 | 7 | a03
> 2 | 3 | 8 | a04
> (3 rows)
>
>
>
======================================================================
> 河本陽一(こうもとよういち)
> mailto:komoto.yoichi @ kcc.co.jp
>
>
--------------------------------------
TSUKAME EIKOU! KAGAYAKE EGAO!
Yahoo! JAPAN JPC OFFICIAL PARTNER INTERNET PORTAL SITE
http://pr.mail.yahoo.co.jp/wintergames/
pgsql-jp メーリングリストの案内