将Oracle Select Query转换为Update Query [已关闭]

a0x5cqrl  于 2023-05-16  发布在  Oracle
关注(0)|答案(2)|浏览(285)

已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

4天前关闭。
Improve this question
我正在尝试将一个工作中的选择查询转换为一个更新查询。我需要根据3个表中的条件将PARTS_MASTER中的LIST_PRICE增加10%。
以下是查询:

select pnm.pn, pnm.description, pnm.list_price, mfg.mfg_code, pnm.list_price_date, whs.warehouse_code, stk.qty_available, stk.stock_line
    from  parts_master pnm join manufacturer mfg on pnm.mfg_auto_key = mfg.mfg_auto_key
                           join warehouse whs on pnm.whs_auto_key = whs.whs_auto_key
                           join stock stk on pnm.pnm_auto_key = stk.pnm_auto_key
    where REGEXP_LIKE(mfg.mfg_code, '^[[:digit:]]+$')AND
                      pnm.list_price_date  BETWEEN TO_DATE('2017-01-02', 'YYYY-MM-DD') AND
                                                   TO_DATE('2023-05-10', 'YYYY-MM-DD') AND
                      pnm.list_price_date IS NOT NULL AND 
                      whs.warehouse_code = 'MI SKYLINE' AND
                      stk.qty_available > 0
                                 
                 
                  
order by mfg.mfg_code
hfsqlsce

hfsqlsce1#

给予这个:

UPDATE 
  parts_master pnm 
SET 
  pnm.list_price = pnm.list_price * 1.1 
WHERE 
  pnm.mfg_auto_key IN (
    SELECT 
      mfg.mfg_auto_key 
    FROM 
      manufacturer mfg 
      JOIN warehouse whs ON mfg.whs_auto_key = whs.whs_auto_key 
    WHERE 
      REGEXP_LIKE(mfg.mfg_code, '^[[:digit:]]+$') 
      AND whs.warehouse_code = 'MI SKYLINE'
  ) 
  AND pnm.pnm_auto_key IN (
    SELECT 
      stk.pnm_auto_key 
    FROM 
      stock stk 
    WHERE 
      stk.qty_available > 0
  ) 
  AND pnm.list_price_date BETWEEN TO_DATE('2017-01-02', 'YYYY-MM-DD') 
  AND TO_DATE('2023-05-10', 'YYYY-MM-DD') 
  AND pnm.list_price_date IS NOT NULL;

我使用一个子查询从manufacturer和stock表中筛选数据,并通过将当前list_price乘以1.1来更新parts_master的list_price。

n3ipq98p

n3ipq98p2#

我知道,根据查询结果,您希望更新parts_master中的相应行。
我假设现有的查询并不“乘”原始表中的行,而是使用连接作为过滤器。如果是这样,那么在Oracle中,一种方法是将连接逻辑转换为exists子查询。对于您显示的查询,这可能如下所示:

update parts_master pnm 
set price_list = 1.1 * price_list
where  
    pnm.list_price_date between date '2017-01-02' and date '2023-05-10'
    and pnm.list_price_date is not null
    and exists (
        select 1
        from manufacturer mfg 
        inner join warehouse whs on pnm.whs_auto_key = whs.whs_auto_key
        inner join stock stk on pnm.pnm_auto_key = stk.pnm_auto_key
        where 
            pnm.mfg_auto_key = mfg.mfg_auto_key
            and regexp_like(mfg.mfg_code, '^[[:digit:]]+$')
            and whs.warehouse_code = 'MI SKYLINE'
            and stk.qty_available > 0
    )

更新表上的条件转到where子句,而连接表上的条件与目标表上的连接条件沿着被移动到exists子查询。

相关问题