Вставить в таблицу, если строка не существует, иначе обновить таблицу, используя Oracle SQL - PullRequest
0 голосов
/ 16 июня 2020

Я использую Oracle базу данных 12 C. У меня есть таблица VK_ORDER, в которой много избыточных данных с комбинацией столбцов OID и EXID. В таблице есть столбец FILENAME, в котором дается имя файла, из которого данные вставляются в эту таблицу, а в таблице есть столбец SYSTEM_INSERTED_AT, в котором дата и время вставлены. В этой таблице выполняется ежедневное задание, и в эту таблицу вставляются избыточные данные комбинации OID и EXID.

Я создал другую таблицу VK_MODIFY со столбцами ниже:

OID
EXID
FILENAME
FIRST_INSERT_DATE 
LATEST_MODIFY_DATE 

Теперь я хочу написать sql статус, я не уверен, работает ли Merge sql статус со следующими условиями:

Если комбинация значений столбцов OID, EXID еще не существует в таблице тогда:

- Insert a new row
- Set FIRST_INSERT_DATE = LATEST_MODIFY_DATE = now()
- Write the name of the file to FILENAME

Если комбинация значений столбцов OID, EXID уже существует в таблице, то:

- set LATEST_MODIFY_DATE = now()
- append the name of the file to FILENAME (prepend a comma – no space)

Я могу просто запускать этот запрос один раз в день для обновления моей таблицы VK_MODIFY. Я не уверен, как написать этот sql статус и возможно ли использовать oracle sql оператор.

DDL для VK_MODIFY таблицы, которая имеет тот же тип данных, что и VK_ORDER таблица .

CREATE TABLE
    VK_MODIFY
    (
     FIRST_INSERT_DATE TIMESTAMP(6) NOT NULL,  
     LATEST_MODIFY_DATE TIMESTAMP(6) NOT NULL, 
     FILENAME VARCHAR2(60) NOT NULL, 
     OID INTEGER,
     EXID VARCHAR2(100)
)

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

Вы можете использовать запрос MERGE следующим образом:

MERGE INTO VK_MODIFY T
USING (SELECT * FROM VK_ORDER) S
   ON (T.OID = S.OID AND (T.EXID = S.EXID OR (T.EXID IS NULL AND S.EXID IS NULL)))
WHEN MATCHED THEN
   UPDATE SET T.FILENAME = S.FILENAME || ',' || T.FILENAME,
              T.LATEST_MODIFY_DATE = SYSDATE
WHEN NOT MATCHED THEN
    INSERT(OID, EXID, FILENAME, FIRST_INSERT_DATE, LATEST_MODIFY_DATE) 
     VALUES (S.OID, S.EXID, S.FILENAME, SYSDATE, SYSDATE);
0 голосов
/ 16 июня 2020

Предполагая, что oid и exid не равны нулю,

merge into vk_modify M 

с использованием (select * from vk_order) O на ((M.OID, M.EXID) = (O.OID, O.EXID) ) при совпадении обновите набор M.filename = M.filename || ',' || O.filename, latest_modify_date = sysdate, если он не найден, затем вставьте (oid, exid, filename, first_insert_date, latest_modify_date) значения (O.oid, O .exid, О. имя файла, sysdate, sysdate);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...