我测试此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(这就是我想要的)的部分。
我现在有点难过。我一直在努力研究这两个子查询,但我没有运气确定问题所在。
答案 0 :(得分:3)
更新查询中的Regexp_like ( sp.part_no,...)
引用SALES_PART_TAB.spart_no
,而在第二个查询中引用SALES_PART.spart_no
。
雾的原因之一是您在同一查询中重新定义别名sp
,因此exists
子查询与正在更新的记录无关。这意味着如果你丢弃exists
条件,你仍然会更新16条记录。这似乎不太可能是你想要的。
使用其他别名,以便区分您想要引用的表。