[pgsql-jp: 36812] WHEREにSELECTふたつ

河本陽一 komoto.yoichi @ kcc.co.jp
2006年 3月 3日 (金) 16:15:54 JST


こうもとです。

 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




pgsql-jp メーリングリストの案内