Как написать программу, которая дублирует строку, когда несколько значений в одном столбце присваиваются одному значению в другом?

#sql #oracle

Вопрос:

У меня есть три стола:

таблица 1:

модуль работник
A Билли Боб
A Билли Джо
B Джон Доу
B Джейн Доу
C Кейти Райс

таблица 2: Primary_Key = (MATERIAL_ID, MATERIAL_NUM)

MATERIAL_ID MATERIAL_NUM модуль
11111111111 222222222222 A
11111111112 222222222223 B
11111111113 222222222224 C

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

таблица 3: Внешний ключ = (MATERIAL_ID, MATERIAL_NUM)

MATERIAL_ID MATERIAL_NUM работник
11111111111 222222222222 Билли Боб
11111111111 222222222222 Билли Джо
11111111112 222222222223 Джон Доу
11111111112 222222222223 Джейн Доу
11111111113 222222222224 Кейти Райс

Я попробовал этот запрос:

 INSERT INTO table3(EMPLOYEE)
SELECT t1.EMPLOYEE
  FROM table1 t1
  FULL OUTER JOIN table2 t2
             ON t1.MODULE = t2.MODULE;
 

У меня уже есть MATERIAL_ID и MATERIAL_NUM заполнено table3 , вставив данные из table2 . Если мне нужно будет повторить это EMPLOYEE в запросе, я просто опустошу таблицу и перепишу ее.

Проблема, с которой я сталкиваюсь, заключается в следующей ошибке: ORA-01400: не удается вставить значение NULL в («MATERIAL_ID»), что, как я полагаю, происходит, потому что у меня нет метода, который дублирует строки, поскольку несколько имен заполняют одно и то же MATERIAL_ID и MATERIAL_NUM . Поэтому мне нужна помощь в создании метода для этого.

Комментарии:

1. Похоже, ты делаешь для себя больше работы, чем тебе нужно. Таблица 3, похоже, вообще не нуждается в существовании — это просто результат объединения таблиц 1 и 2, но с дополнительной возможностью быть несовместимым с ними.

2. Являются ли ценности table2.MODULE уникальными? Если нет, то полное присоединение к нему может вызвать проблемы

3. @Damien_The_Unbeliever Я создал таблицу 3, чтобы была прямая корреляция между материалом и сотрудником, который за него отвечает. Он также будет использоваться для инструмента подачи заявок на материалы, где сотрудники могут напрямую выбирать материал по его идентификатору/номеру.

4. Модули @AlexeyLarionov не уникальны, но я не уверен, как еще присоединиться к таблицам

Ответ №1:

Я думаю, вам нужен UPDATE столбец сотрудника, а не INSERT новые строки:

 update table3 t3
    set employee = (select t1.employee
                    from table1 t1 join
                         table2 t2
                         on t2.module = t1.module
                    where t3.materialid = t2.materialid
                   );
 

Комментарии:

1. Я получаю синтаксическую ошибку table3 после обновления. Это говорит о частично признанных правилах…

2. @TheSchmidly . . . Таков update синтаксис. Конечно, вам нужно указать свое фактическое имя таблицы. Синтаксис работает просто отлично: dbfiddle.uk/.

3. Тогда я не уверен, что происходит не так, я продолжу расследование. Может быть, я что-то упускаю. Кстати, этот сайт хорош, так что спасибо, что поделились им.

4. Я понял, что набирал таблицу обновлений table3 вместо таблицы обновлений table3 lol