【问题标题】:Update Query fails to update correctly - Oracle更新查询无法正确更新 - Oracle
【发布时间】:2011-11-05 15:15:13
【问题描述】:

根据我之前的查询Update Query,我继续重写整个查询,如下所示:

表 A 通过[PRD_ID, PRD_VER, PY_ID, TPY_ID] 上的一对多关系连接到表 B,表 C 通过[PRD_GTIN_ID] 上的一对一关系连接到表 B。我需要将表 A 上的 X、Y、Z 列复制到表 C 上的 X、Y、Z

DECLARE CURSOR eachRec IS 
SELECT  cgl.prd_gtin_id,
        tc.PRD_SPL_OR_QTY_MULTIPLE
FROM B cgl,
     A tc
WHERE cgl.prd_id       = tc.prd_id
  AND cgl.prd_ver      = tc.prd_ver
  AND cgl.py_id        = tc.py_id
  AND cgl.tpy_id       = tc.tpy_id;

BEGIN
  FOR EACH_ROW IN eachRec
  LOOP
    UPDATE C
    SET    C.PRD_ORDER_QTY_MULTIPLE=EACH_ROW.PRD_ORDER_QTY_MULTIPLE
    WHERE  C.prd_gtin_id = EACH_ROW.prd_gtin_id;
  END LOOP;
END;

该查询除了更新正确的匹配项外,还更新了不正确的随机行。谁能帮我找出我写的查询的问题?

【问题讨论】:

  • 为什么要使用游标?您只需一条更新语句即可实现相同的目的,这将比您的游标方法快很多。
  • 好吧,我并不真正关心这个查询的性能。这将只完成 1 次(类似于要更新 30K 记录的迁移)。我唯一关心的显然是查询结果的准确性。

标签: sql oracle oracle11g sql-update


【解决方案1】:

您真正需要的是了解保留键的表和可更新连接视图的概念。

由于这些都是不平凡的主题,并且 Oracle 在文档中很好地涵盖了它们,因此我将向您指出相关文档: http://download.oracle.com/docs/cd/E11882_01/server.112/e25494/views001.htm#ADMIN11782

如果您能够阅读和理解这些概念,那么使用一条更新语句就可以完成您想要的操作,这将更清晰、更容易理解、更快、更高效。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多