0

このスレッドを調べて、そこに答えがあると思っていましたが、残念ながら見つかりませんでした...

SQL または PL/SQL を使用して最初の重複行のみを更新する Oracle の UPDATE ステートメント

お客様がデフォルトのメール アドレスを選択していない場合は、その値を更新する必要があります。

次のステートメントは、顧客がまだデフォルトの電子メールを持っていない場合、そのテーブルのすべてのレコードを更新します。

update si_contactemails 
set ISDEFAULT = 'Y'
where entityid in
(select customerid from si_customers where custstatus = 'A' and deleted = 0)
and entityid in (select entityid from si_contactemails group by entityid having MAX(ISDEFAULT) = 'N')

しかし、顧客がたまたま si_contactemails テーブルに複数のエントリを持っている場合、この顧客の最初のレコードを更新する必要があるだけで、デフォルトを持つことができるのは 1 つだけです。

上記の記事で見つけた次の追加を試してみましたが、すべての条件が真である最初のレコードのみを更新します - 条件が真であるすべてのレコードを更新するにはどうすればよいですか?

update si_contactemails 
set ISDEFAULT = 'Y'
where entityid in
(select customerid from si_customers where custstatus = 'A' and deleted = 0)
and entityid in (select entityid from si_contactemails group by entityid having MAX(ISDEFAULT) = 'N')
AND rowid = (SELECT min(rowid) 
                 FROM   si_contactemails 
                 WHERE entityid in (select min(entityid) from si_contactemails group by entityid having MAX(ISDEFAULT) = 'N'))

任意の入力を歓迎します:-)

どうもありがとう、

ステフ

4

1 に答える 1

0

1 つのアプローチを次に示します。

UPDATE si_contactemails
   SET isdefault = 'Y'
 WHERE rowid IN
        ( SELECT MIN(rowid)
            FROM si_contactemails
           WHERE entityid IN
                  ( SELECT customerid
                      FROM si_customers
                     WHERE custstatus = 'A'
                       AND deleted = 0
                    MINUS
                    SELECT entityid
                      FROM si_contactemails
                     WHERE isdefault = 'Y'
                  )
           GROUP
              BY entityid
        )
;

(1) ステータスがあり、削除されていない、および (2) にデフォルト レコードがない顧客ごとrowidに、で正確に 1 つ検出されます。次に、その一連の のすべてのレコードを更新します。si_contactemailsAsi_contactemailsrowid

(免責事項:テストされていません。)

于 2012-07-23T17:11:02.073 に答える