【问题标题】:Select and Update statement help needed需要选择和更新语句帮助
【发布时间】:2016-10-03 23:57:36
【问题描述】:

场景:

我有两个表: Vendors 表提供唯一标识符;并且 Order 表的行包含一列,该列具有我们想要剥离的唯一标识符。例如:唯一 ID:12345 并且内容有“Order for 12345”...期望的结果,字面意思是:“Order for XXXXX”

我需要一个 select 语句来显示表 2 中的哪些记录实际上具有唯一标识符和一个 update 语句来进行剥离。

架构

Table Vendors
    ID   varchar2(9)
    NAME varchar(50)

Table Orders
    OrderNumber varchar2(10)
    Dscr        varchar(250) <----order description

示例:

Vendors
12345 Joe
23456 Jenni

Orders
A123456 | Order for 12345 <---notice this number is the ID of the Vendor
B039483 | Order for 23456

期望的结果:

Orders 
    A123456 | Order for XXXXX
    B039483 | Order for XXXXX

我目前所拥有的:

DECLARE  
  TYPE dscr_type IS TABLE OF VARCHAR2(250);
  chk_dscr_coll dscr_type;

BEGIN 
  -- gather a list of IDs to use
  FOR someone IN (
    SELECT unique(ID) FROM vendors WHERE TIN IS NOT NULL
  )

  -- loop through the Orders table
  -- try to match the ID agains each record via regular expression

  LOOP
    SELECT dscr BULK COLLECT INTO dscr_coll
    FROM orders
    WHERE REGEXP_LIKE(dscr, '.*'||someone.ID||'.*');
    DBMS_OUTPUT.PUT_LINE('>>>>>>>>>>>>>>'||dscr_coll(1));

  END LOOP;
  EXCEPTION 
    WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('');
END;
/

更新

我按照 Kordirko 提供的线索提出了这个 MERGE 声明。

MERGE INTO AFMOWN.ABS_DOC_ACTG target
USING (
   SELECT v.TIN 
   FROM AFMOWN.R_VEND_CUST v
   where v.TIN is not null
) vendor
ON (chk_dscr LIKE '%' || vendor.TIN || '%')
WHEN MATCHED THEN UPDATE
SET chk_dscr = REGEXP_REPLACE( chk_dscr, vendor.TIN, '999999999' );

不幸的是,我收到了这个错误: UPDATE SET 的 LHS 包含 ON 子句中引用的列

有人可以帮忙吗?

【问题讨论】:

  • 我不知道你想要什么。向我们展示数据库架构、示例数据和预期结果。你在那个存储过程上做了很多没有意义的事情。请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。

标签: sql oracle select sql-update


【解决方案1】:

尝试 MERGE 语句:

MERGE INTO Orders
USING (
   SELECT v.id FROM Vendor v
   JOIN Orders o
   ON v.descr LIKE '%' || v.id || '%'
) x
WHEN MATCHED THEN UPDATE
SET descr = REPLACE( descr, x.id, 'XXXXX" )
;

【讨论】:

  • 不确定这是否适用于 MSSQL 或 MySQL,但它不适用于 Oracle,但使用 MERGE 是一个很好的线索。我还在玩它。
  • 我刚刚在Oracle中尝试了MERGE,但在我的场景中不起作用,因为ON子句中使用了DSCR,因此无法更新。
  • 我将此标记为解决方案,因为 MERGE INTO 是正确的方法。尽管此答案中提供的陈述在语法上不正确,但方法是正确的。
【解决方案2】:

您不需要为此使用 PL/SQL 代码。假设订单号需要替换为“XXXXX”,您可以执行以下操作:

update orders set dscr = regexp_replace(dscr, '\d+', 'XXXXX')

【讨论】:

  • 我把场景过于简单化了,这是我的错。现实情况是 dscr 字段中可能还有其他数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多