1

一括更新をしようとしています:

> update ti_table set enabled=T.enabled 
    from (select * from 
         unnest(array['2001622', '2001624', '2007903']) as id,
         unnest(array[15,14,8]) as ver,
         unnest(array['type1', 'type1', 'type1']) as type,
         unnest(array[false, true, true]) as enabled) T 
    where ti_table.id=T.id AND ti_table.ver=T.ver AND ti_table.type=T.type;

しかし、読み返すと:

> select id, ver, type, enabled from ti_table where id in ('2001622', '2001624', '2007903');

そうですか:

   id    | ver | type  | enabled 
---------+-----+-------+---------
 2001622 |  15 | type1 | f
 2001624 |  14 | type1 | f
 2007903 |   8 | type1 | f

最後の2行で有効になっているのはfalse、私が期待していたときですtrue

なぜこれが起こっているのですか?どうすれば正しく行うことができますか?

ありがとう。

4

2 に答える 2

4

節でunnest3 回呼び出しています。つまり、3 の (デカルト積) を実行していることを意味します。FROMCROSS JOIN

PostgreSQL 9.4 以降を使用している場合は、unnest各配列を入力として指定する1 つの呼び出しを簡単に行うことができます。

select * from 
         unnest(
            array['2001622', '2001624', '2007903'],
             array[15,14,8],
             array['type1', 'type1', 'type1'],
             array[false, true, true]
        ) as u(id, ver, type, enabled)

別のオプションは、どのバージョンでも、 の代わりにunnestinへの呼び出しを追加することです。SELECTFROM

select
   unnest(array['2001622', '2001624', '2007903']) as id,
   unnest(array[15,14,8]) as ver,
   unnest(array['type1', 'type1', 'type1']) as type,
   unnest(array[false, true, true]) as enabled

どちらの場合も、特に最後の場合は、各配列の要素数が正確に同じであることを確認する必要があります。最初のメソッドにない場合、欠落している各行は NULL として埋められますが、2 番目のメソッドでは、それぞれによって返される行数のLCMと同じ数の行が返されます。これはおそらく望ましくありません。例:

SELECT * FROM unnest(array[1,2,3,4], array['a','b','c','d','e','f']);
 unnest | unnest 
--------+--------
      1 | a
      2 | b
      3 | c
      4 | d
 [null] | e
 [null] | f
(6 rows)

SELECT unnest(array[1,2,3,4]), unnest(array['a','b','c','d','e','f']);
 unnest | unnest 
--------+--------
      1 | a
      2 | b
      3 | c
      4 | d
      1 | e
      2 | f
      3 | a
      4 | b
      1 | c
      2 | d
      3 | e
      4 | f
(12 rows)

詳細については、テーブル関数呼び出しに関するドキュメントを確認してください。

于 2016-09-21T20:58:19.023 に答える