2016-06-03 2 views
0

Сценарий:Выбор и обновление личных данных необходима помощь

У меня есть две таблицы: Вендоры таблица содержит уникальные идентификаторы; и таблица Order имеет строки, содержащие столбец с уникальными идентификаторами, которые мы хотим разбить. Например: уникальный идентификатор: 12345, а контент имеет «Заказ на 12345» ... желаемый результат, буквально: «Заказ для XXXXX»

Мне нужен оператор выбора, чтобы показать, какие записи из таблицы 2 действительно имеют уникальную идентификатор и оператор обновления для удаления.

Схема

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; 
/

UPDATE

Я следую за лидерство, представленную 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'); 

К сожалению, я получил эту ошибку: LHS из UPDATE SET содержит столбцы, на которые ссылается О п

Может кто-то помочь?

+1

Я не имею понятия, что вы хотите. Покажите нам схему db, образцы данных и ожидаемый результат. Вы делаете много вещей в этой процедуре магазина, не имеет смысла. Пожалуйста, прочитайте [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t И вот отличное место для [** START **] (http : //spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/), чтобы узнать, как улучшить качество вопроса и получить лучшие ответы. –

ответ

0

Try 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") 
; 
+0

не уверен, что эта работа для MSSQL или MySQL, но она не работает для Oracle, но использование MERGE - хорошее преимущество. Я все еще играю с этим. –

+0

Я просто попробовал MERGE в Oracle, но он не работает в моем сценарии, потому что DSCR используется в предложении ON, поэтому он не может быть обновлен. –

+0

Я отмечаю это как решение, потому что MERGE INTO - правильный подход. Хотя утверждение, приведенное в этом ответе, не является синтаксически правильным, но подход есть. –

0

Для этого вам не нужен код PL/SQL. Если предположить, что порядковые номера должны быть заменены на «ХХХХХ» вы можете сделать что-то вроде этого:

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

Это мое плохое, что я упрощаю сценарий. Реальность такова, что в поле dscr могут быть другие числа. –

Смежные вопросы