更新与EXISTS

时间:2017-09-05 18:58:21

标签: sql oracle oracle11g erp

我测试此UPDATE语句以更新数据库中的所有4%,8%和9%部分。我试图让QTY_MULTIPLE值与每层的CASES值相匹配。

因此,REGEXP_LIKE最终会读取:

> Regexp_like ( sp.part_no, '^4|^8|^9' )

现在还没有,因为我正在测试三个特定部分。我想确保声明的其余部分按照它应该的方式工作。

以下是我测试的内容:

UPDATE SALES_PART_TAB sp
SET    sp.qty_multiple = ( SELECT cases_per_layer
                           FROM   HH_INV_PART_CHARS
                           WHERE  sp.part_no = HH_INV_PART_CHARS.part_no AND
                                  sp.contract = HH_INV_PART_CHARS.contract )
WHERE  Regexp_like ( sp.part_no, '^410-0017|^816-0210|^921-0003' ) AND
       EXISTS
       ( SELECT sp.contract,
       sp.part_no,
       sp.qty_multiple,
       HH_INV_PART_CHARS.cases_per_layer
         FROM   SALES_PART sp
                inner join HH_INV_PART_CHARS
                        ON sp.part_no = HH_INV_PART_CHARS.part_no AND
                           sp.contract = HH_INV_PART_CHARS.contract
         WHERE  sp.qty_multiple != HH_INV_PART_CHARS.cases_per_layer ); 

当我运行此语句时,它会更新16行。

但是,我希望它能够更新15行。我通过运行以下SELECT语句得出了这个结论:

SELECT sp.contract,
       sp.catalog_no,
       sp.qty_multiple,
       HH_INV_PART_CHARS.cases_per_layer
FROM   SALES_PART sp
       inner join HH_INV_PART_CHARS
               ON sp.part_no = HH_INV_PART_CHARS.part_no AND
                  sp.contract = HH_INV_PART_CHARS.contract
WHERE  sp.qty_multiple != HH_INV_PART_CHARS.cases_per_layer AND
       Regexp_like ( sp.part_no, '^410-0017|^816-0210|^921-0003' )

认为我遇到的问题是UPDATE语句正在更新HH_INV_PART_CHARS上存在sales_part表中part_no和contract的所有行。它并没有将更新限制在qty_multi不等于cases_per_layer(这就是我想要的)的部分。

我现在有点难过。我一直在努力研究这两个子查询,但我没有运气确定问题所在。

1 个答案:

答案 0 :(得分:3)

更新查询中的Regexp_like ( sp.part_no,...)引用SALES_PART_TAB.spart_no,而在第二个查询中引用SALES_PART.spart_no

雾的原因之一是您在同一查询中重新定义别名sp,因此exists子查询与正在更新的记录无关。这意味着如果你丢弃exists条件,你仍然会更新16条记录。这似乎不太可能是你想要的。

使用其他别名,以便区分您想要引用的表。