0

我查看了这个帖子,我以为我会在那里找到我的答案,但不幸的是没有......

Oracle 中的 UPDATE 语句使用 SQL 或 PL/SQL 仅更新第一个重复行

如果我们的客户没有选择默认电子邮件地址,我需要更新该值。

如果客户还没有默认电子邮件,则以下语句会更新该表的所有记录:

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 表中有多个条目,我只需要更新该客户的第一条记录,只能有一个默认值。

我尝试了在上面提到的文章中找到的以下添加,但它只更新所有条件都为真的第一条记录 - 如何更新条件为真的所有记录?

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

这是一种方法:

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
        )
;

rowid它为si_contactemails每个客户准确找到一个(1) 具有状态A且未被删除且 (2) 在 中没有默认记录的客户si_contactemails。然后它更新那组rowids 中的每条记录。

(免责声明:未经测试。)

于 2012-07-23T17:11:02.073 回答