Код ошибки «Подзапрос вернул более 1 значения [...]» - PullRequest
1 голос
/ 16 марта 2020

Я пытаюсь скопировать строки из таблицы 1 в новую таблицу 3 (которую я создал), где идентификатор из таблицы 1 не существует в таблице 2 (даже если некоторые строки идентичны) и где хотя бы одна из моих 3 ключи в таблице 1 не равны нулю

Я использую "NOT IN" , но все равно он возвращает следующий код ошибки:

Подзапрос возвратил более 1 значения , Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

Вот мой код:

INSERT INTO table_3
SELECT ID, Key_1, Key_2, Key_3
FROM table_1
WHERE (SELECT ID FROM table_1) NOT IN (SELECT ID FROM table_2)
AND (Key_1 IS NOT NULL) OR (Key_2 IS NOT NULL) OR (Key_3 IS NOT NULL)

Ответы [ 2 ]

2 голосов
/ 16 марта 2020

Я бы не рекомендовал использовать NOT IN вместо NOT EXISTS. NOT IN отфильтрует ВСЕ строки, если ЛЮБЫЕ значения в подзапросе равны NULL.

Кроме того, вы должны перечислить вставляемые столбцы.

Итак:

INSERT INTO table_3 (ID, Key_1, Key_2, Key3)
    SELECT t1.ID, t1.Key_1, t1.Key_2, t1.Key_3
    FROM table_1 t1
    WHERE NOT EXISTS (SELECT 1
                      FROM table_2 t2
                      WHERE t2.id = t1.id
                     ) AND
         (t1.Key_1 IS NOT NULL) OR
         (t1.Key_2 IS NOT NULL) OR
         (t1.Key_3 IS NOT NULL)
1 голос
/ 16 марта 2020

Вам потребуется использовать идентификатор из таблицы_1 для сравнения в условии НЕ в состоянии.

Я также предлагаю вам ссылаться на столбцы по псевдониму, а также помещать условия ИЛИ в надлежащие скобки.

Например:

INSERT 
  INTO table_3
SELECT a.ID,a.Key_1,a.Key_2,a.Key_3 
  FROM table_1 a
 WHERE a.ID NOT IN (SELECT ID FROM table_2)
   AND( (a.Key_1 IS NOT NULL) 
    OR (a.Key_2 IS NOT NULL) 
    OR (a.Key_3 IS NOT NULL)
       )
...