2016-09-08 3 views
1

У меня есть следующие таблицы:Переберите данных курсора и вставить запись, если она не существует

Table1:

doc_id | item_id 
------ | ------ 
71  | 4 
------ | ------ 
75  | 8 
------ | ------ 
75  | 3 
------ | ------ 
75  | 2 
------ | ------ 
73  | 7 

Table2:

id  | parent_id | parameter_id 
------ | -----------|------------- 
1  | 4   | 4 
------ | -----------|------------- 
2  | 8   | 3 
------ | -----------|------------- 
3  | 3   | 4 
------ | -----------|------------ 
4  | 2   | 6 
------ | -----------|------------ 
5  | 7   | 4 

Я хочу, чтобы вставить строку в таблице 2 следующим образом:

  1. Выберите item_id из таблицы 1, где document_id = 75;

  2. Для каждого item_id из 1. проверьте, существует ли запись в таблице 2, где parent_id таблицы2 = item_id таблицы 1 и parameter_id = 4;

  3. Если запись не существует, введите данные.
    При вставке он должен вставлять в Таблицу 2 значения (max (id) +1, parent_id этой конкретной записи (связанный элемент item1id таблицы1), 4 как параметр_id).

Как это сделать? Может кто-нибудь дать мне какой-то намек. Я думаю использовать курсор и прокрутить его и проверить, существует ли запись. Затем вставьте данные соответственно?

DECLARE CURSOR C1 
IS 
    SELECT * FROM table 1 
    WHERE DOC_ID = 75; 
BEGIN 
FOR EACH_RECORD IN C1 LOOP 
    // check for Table 2 for EACH_RECORD.CONFIG_ITEM_ID; 
END LOOP; 
END; 
/
+0

Добро пожаловать на Stackoverflow , Мы здесь, чтобы помочь вам - не делайте для вас работы: вы должны показать нам, что вы пробовали, и где вы потерпели неудачу (что также означает - задание более целенаправленного вопроса). – alfasin

+0

Я. В другом вопросе/ответе упоминается команда слияния. это, вероятно, самый простой способ сделать это. – EvilTeach

+0

Как заметил JNevill, это может быть один оператор SQL. Начните с определения оператора выбора, который идентифицирует строки в Таблице 1, которые должны быть введены в Таблицу 2. Использовать коррелированный подзапрос «где не существует» для текста, существует ли строка в таблице 2, которая соответствует описанным вами условиям , Из этого запроса вы сможете разработать инструкцию insert. Попытайтесь использовать последовательность, чтобы дать вам значение для столбца id, а не пытаться увеличить максимальный уровень в настоящее время в таблице. –

ответ

1
insert into table2 
(
    id, 
    parent_id, 
    parameter_id 

)(
    select 
     (select (max(id)) from table2) + rownum, 
     item_id, 
     4 
    from 
     table1 
    where 
     table1.doc_id = 75 and 
     not exists(select 1 from table2 where table1.item_id = table2.parent_id and table2.parameter_id = 4) 
) 

Вставка запросов выше вставки в table2max(id) +1, item_id из table1 и 4 в качестве parameter_id, где doc_id составляет 75, и не существует запись в table2, где table1.item_id = table2.parent_id

+0

Несколько проблем здесь. 1) Вы используете синтаксис SQL Server ('max_id = ...'). 2) '(max (id) + 1)' часть запроса не будет работать, потому что все «новые» строки будут иметь одно и то же новое значение «max_id», поэтому вы будете вставлять дубликаты. – sstan

+0

@sstan Я только что понял это. Спасибо, что принесли это. Эту проблему можно было бы избежать, если бы идентификатор был идентичным, и ему нужно было создать новый столбец или создать новую таблицу и скопировать старую таблицу поверх – Stivan

+0

@sstan. Я просто обновил, где вы сказали, что у меня есть некоторые проблемы. Есть ли еще что-то, что вы видите не так? – Stivan

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