【问题标题】:Transform update statement with joins from SQL Server into Oracle将带有连接的更新语句从 SQL Server 转换为 Oracle
【发布时间】:2017-08-02 15:11:07
【问题描述】:

此更新语句在 SQL Server 上完美运行,但在 Oracle 上却不行。

UPDATE wfu
set klient_id_crma= K.KLIENT_PROD_ID
, umowa_id_crma= u.umowa_id
from wh_ods.umowy u
join WNIOSKI_umowy wfu
on u.NUMER_REFERENCYJNY = wfu.numer
JOIN WH_ODS.KLIENCI K
ON U.KLIENT_ID= K.KLIENT_ID

在 Oracle 上使用少量联接进行更新的最简单方法是什么?

该方法返回错误:

UPDATE
(SELECT wfu.klient_id_crma as OLD, table2.KLIENT_PROD_ID as NEW
 FROM nest_crma.WNIOSKI_umowy wfu
 INNER JOIN
(SELECT u.numer_referencyjny,k.KLIENT_PROD_ID
from wh_ods.umowy u
JOIN WH_ODS.KLIENCI K
N U.KLIENT_ID= K.KLIENT_ID) table2
 ON wfu.numer = table2.numer_referencyjny
) t
SET t.OLD = t.NEW

ORA-01779: 无法修改映射到非保留键的列 表

【问题讨论】:

  • 路过式投票是怎么回事?如果他们在帖子中解释了他们发现错误或令人反感的内容,那么任何投反对票的人都会为社区做出更大的贡献。这个问题是相关的,提供了所有必要的细节,并且标签是完全正确的。什么鬼?

标签: sql-server oracle sql-update


【解决方案1】:

这样的东西应该可以工作

update WNIOSKI_umowy wfu set (klient_id_crma,umowa_id_crma) = (
    select K.KLIENT_PROD_ID, u.umowa_id 
    from wh_ods.umowy u
    JOIN WH_ODS.KLIENCI K ON U.KLIENT_ID= K.KLIENT_ID
    where u.NUMER_REFERENCYJNY = wfu.numer);

【讨论】:

  • It works only if the result of the select return unique value per wfu.number.
【解决方案2】:

您的更新取决于两个查找:您在表umowynumer_referencyjny 列中查找wnioski_umowy.number,然后您在表klienciklient_id 列中进一步查找umowy.klient_id

这些查找要求umowy 中的numer_referencyjnyklienci 中的klient_id 必须唯一(也就是说,它们没有重复值)。这是一个明显的逻辑要求,与 Oracle、SQL 和一般计算机无关;查找必须是唯一的,否则您使用什么进行更新?

有几种可能。

如果这些列包含重复项,那么问题就没有意义了。

如果列不包含重复项,但 Oracle 不知道,则通过连接更新将失败,并出现与列确实存在重复项相同的错误。原因是 Oracle 解析器在处理输入数据之前判断查询的正确性,而不是在检查之后。所以 - 如果这两列中的每一列都没有 UNIQUE 索引,则 Oracle 不知道没有重复项(即使 知道这一点)。

要通过 JOIN 进行 UPDATE,您需要先在这两列上添加 UNIQUE 索引。 (这也将有助于提高性能!)您可以在这里看到一个非常简单的说明:Update with joins

另外几点观察:在现有的 SQL Server 查询中,您正在更新两列。在您尝试的 Oracle 查询中,您只更新一列。也许您只是想“让它工作”,然后完全转换更新。而且,不清楚为什么要将一个联接分离到一个子查询中 - 如果您在不使用任何括号的情况下联接三个表,“通过联接更新”应该可以工作。

【讨论】:

  • 非常感谢这个有用的解释,唯一索引有很大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2019-04-21
  • 1970-01-01
相关资源
最近更新 更多