0

我需要更新表中的评论字段以获取大量 customer_ids。需要更新评论以包括现有评论并附加一些文本和另一个表中的密码。我不太确定该怎么做。

这是一些针对单个客户 ID 执行此操作的代码。对于超过 100 个客户 ID 的列表,我将如何处理?我的第一个想法是创建一个临时表并将所有客户 ID 放在其中,但我仍然不确定之后如何对其进行编码,因为在查询中使用了 customer_id 两次。

Update Contract
SET Contract_Comment= Contract_Comment || '; 12/29/2008 Password `' ||
(SELECT Password FROM WLogin WHERE default_customer_id='1234' ) ||'`'|| ' reinstated per Mickey Mouse;'
WHERE Customer_id='1234'
4

3 回答 3

1

好吧,假设 Contract_comment 有一个 customer_id,或者很容易连接到一个确实有一个的表......

update contract c
set contract_comment = contract_comment || '; 12/29/2008 Password ' ||
(select password from WLogin w where w.default_customer_id = c.customer_id) ||''|| ' reinstated per Mickey Mouse;' WHERE Customer_id in (1234, 4567).

或者,用另一个子选择替换最后的列表...

WHERE Customer_id in(从 ... 中选择 customer_id)。

于 2008-12-24T17:30:28.577 回答
0

我同意托德所说的一切,并希望补充以下内容。

尽管可能并不明显,但他还(可能)更正了您发布的另一个错误,即将 customer_id 字段视为字符串。

通过将 id 放在引号内(至少在您的示例中),您将强制 Oracle 在比较之前将所有行转换为字符串,或者将您提供的 id 转换为整数 - 我必须尝试确定实际将适用的规则。

无论哪种方式,最好与您的数据类型保持一致,而不是将其留给数据库来解决。

您说提供的代码是针对单个客户的。如果您在循环中部署此代码,请确保您使用绑定变量,而不是仅将客户 ID 连接到您正在构建的 SQL 语句中。如果您在 PL/SQL 中执行此操作,那么它会为您完成 - 使用 Java 或其他语言您必须自己执行此操作。

于 2008-12-29T03:29:41.983 回答
0

上面托德的回答可以使用 IN (或 EXISTS 子句,如果您将 ID 存储在临时表中。我只是将其增强如下:

UPDATE contract c
   SET contract_comment = nvl2(contract_comment, contract_comment || '; ', '') || '12/29/2008 Password ' ||
                          NVL((SELECT PASSWORD
                                FROM wlogin p
                               WHERE p.default_customer_id = c.customer_id),
                              '<NULL>') || '' || ' reinstated per Mickey Mouse'
 WHERE EXISTS (SELECT 'x' FROM wlogin l WHERE l.default_customer_id = c.customer_id)

这可确保 1) 您正在处理密码是否为空,以及 2) 您只为具有 wlogin 记录的客户进行更新。

随意添加如下内容:

AND EXISTS (SELECT 'y' FROM temp_ids_table t WHERE t.customer_id = c.customer_id)

感谢您为这些正确答案提供的任何信用。

于 2009-01-02T18:14:09.517 回答