#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