将带有SQL Server连接的更新语句转换为Oracle

时间:2017-08-02 15:11:07

标签: sql-server oracle sql-update

此更新语句在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:无法修改映射到非密钥保留的列   表

2 个答案:

答案 0 :(得分:1)

您的更新取决于两次查询:您在表wnioski_umowy.number的{​​{1}}列中查找numer_referencyjny,然后在列{umowy中进一步查找umowy.klient_idklient_id的1}}。

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

有几种可能性。

如果这些列包含重复项,则问题是荒谬的。

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

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

其他一些观察结果:在现有的SQL Server查询中,您要更新两列。在您尝试的Oracle查询中,您只更新了一列。也许你只是想让它变得有效"然后完全转换更新。并且,不清楚为什么要将一个连接分成一个子查询 - 通过连接"更新#34;如果你加入三个表而不使用括号,那么应该可以工作。

答案 1 :(得分: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);