Получение ошибки в Oracle "ORA-01400: невозможно вставить NULL в ...", когда отсутствуют значения NULL - PullRequest
0 голосов
/ 17 мая 2019

В настоящее время я пытаюсь выполнить приведенный ниже код на Oracle SQL:

INSERT INTO author (totalrevenue)

SELECT NVL (margin, 0)
FROM (SELECT a.author_Fname, a.author_lname, SUM (b.totalmargin) as margin 
FROM author a LEFT JOIN bookauthor ba ON a.author_id = ba.ba_authorid
LEFT JOIN book b ON ba.ba_isbn = b.book_isbn
GROUP BY a.author_fname, a.author_lname);

Запрос SELECT возвращает столбец из 14 значений, которые НЕ равны NULL, что достигается с помощью NVL.

Однако я все еще получаю следующее: "ORA-01400: невозможно вставить NULL в (" IT337052 "." AUTHOR "." AUTHOR_ID ")" ошибка, когда я выполняю запрос INSERT вместе с запрос SELECT.

Есть идеи, пожалуйста?

Ответы [ 3 ]

2 голосов
/ 17 мая 2019

похоже вы пропустили AUTHOR_ID при вставке данных

INSERT INTO author (AUTHOR_ID,totalrevenue)

SELECT AUTHOR_ID,NVL (margin, 0)
FROM (SELECT a.AUTHOR_ID , SUM (b.totalmargin) as margin 
FROM author a LEFT JOIN bookauthor ba ON a.author_id = ba.ba_authorid
LEFT JOIN book b ON ba.ba_isbn = b.book_isbn
GROUP BY a.AUTHOR_ID);
1 голос
/ 17 мая 2019

Это должен быть оператор UPDATE (или MERGE). Я подозреваю, что ваша первоначальная попытка выполнить оператор обновления не удалась, поскольку вы не соотносили подзапрос с таблицей, которую вы обновляете.

Я думаю, что вы ищете что-то вроде:

UPDATE author a
SET    totalrevenue = (SELECT SUM(b.totalmargin) AS margin
                       FROM   bookauthor ba
                              LEFT JOIN book b ON ba.ba_isbn = b.book_isbn
                       WHERE  a.authorid = ba.ba_authorid)
WHERE  totalrevenue != (SELECT SUM(b.totalmargin) AS margin
                        FROM   bookauthor ba
                               LEFT JOIN book b ON ba.ba_isbn = b.book_isbn
                        WHERE  a.authorid = ba.ba_authorid);

Я добавил предложение where, чтобы избежать обновления строк, которые уже имеют правильное значение. Вы можете исключить это, но если вы это сделаете, это будет означать, что каждая строка в таблице автора будет обновлена, даже если значение уже было правильным, то есть может быть выполнено больше работы, чем необходимо. Однако если вы создали этот столбец и вам нужно его заполнить впервые, вам не понадобится предложение where, так как вам все равно нужно обновлять каждую строку.

1 голос
/ 17 мая 2019

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

И мне очень интересно, почему вы пытаетесь вставить новые значения, когда ваши расчеты основаны на существующих значениях, и вы хотите вычислить общее количество для существующих авторов.Что-то не так с потоком.Вы должны использовать UPDATE или INSERT в новую таблицу с итогами.Но не так, как вы используете в select

...