【问题标题】:Oracle Update Statement Based on Select Query w/ Joins Not Working基于不工作的选择查询的 Oracle 更新语句
【发布时间】:2017-11-22 21:18:43
【问题描述】:

我正在尝试基于具有联接的选择查询应用更新查询,但它不起作用。

UPDATE (
  SELECT 
    LOCATION_NUM, LOCATION_TYPE, LOCATION_CITY, ACCOUNT_NUM
  FROM 
    TBLSALES T1
    INNER JOIN TBLCENTER  T2 ON T2.LOCATION_ID = T1.LOCATION_ID
    INNER JOIN TBLACCOUNT T3 ON T3.ACCOUNT_ID  = T1.ACCOUNT_ID
  WHERE
    LOCATION_CITY = 'New York' 
    AND LOCATION_NUM LIKE 'NY1%' 
    AND ACCOUNT_NUM IN ('40001','40002','40003')
)
SET 
   LOCATION_TYPE = 'TYPE 1'
;

运行时出现以下错误:

SQL Error: ORA-01779: cannot modify a column which maps to a non key preserved table

【问题讨论】:

    标签: sql oracle join sql-update


    【解决方案1】:

    当您像您一样尝试通过连接进行更新时,必须满足两个条件:

    • 查找表中的查找键(您有两个表,因此两个查找键,tblcenter 中的location_idtblaccount 中的account_id)不能有重复项;它必须是“唯一的”(在“没有重复值”的意义上)。这是一个明显的逻辑要求;如果不满足,基于模糊查找的更新问题就是无稽之谈。
    • Oracle 需要在解析时事先知道唯一性将保持不变。也就是说,表必须在这些列上具有唯一约束和/或唯一索引。这不是逻辑要求,而是 Oracle 实施要求。错误消息告诉您,对于两个查找表中的至少一个(可能同时针对两者),不满足第二个条件。

    如何解决这个问题?您有几个选择:

    • 最简单:在这些表中的这些列上创建 UNIQUE 约束(或 PRIMARY KEY 约束)。他们很可能意味着首先是PK,但事实并非如此。请注意这里 - “主键”或“唯一”约束在应用程序中维护 - 正如我被告知 PeopleSoft 所做的那样,例如 - 没有帮助

    • 您可以通过 MERGE 语句进行更新。语法将非常相似。不同之处在于,MERGE 会一直等待,直到它看到所有数据,并且只有当它事实上在实际数据中发现不应该发现重复的重复项时才会抱怨。

    • 效率稍低,但有一个明显的解决方法:将语句重写为

      更新 tblsales 设置 location_type = '类型 1' 在哪里(.....)

    ...直到现在我才意识到我并没有真正进入 WHERE 子句。如果您会说(在 UPDATE 语句本身中!)哪些列来自哪些表,这将有所帮助。我猜 LOCATION_NUM 来自 SALES 表?那么 WHERE 子句应该类似于

    where location_num like 'NY1%'
      and location_num in (select location_num from the three-way join)
    

    (假设这是您原来的 UPDATE 语句的含义)。

    【讨论】:

      猜你喜欢
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      相关资源
      最近更新 更多