вставка mysql из одной таблицы в другую на основе выбора

#mysql #sql-insert

#mysql #sql-вставка

Вопрос:

Предположим, у нас есть

Таблица A

 field 1 | field 2

orange  | fruit
apple   | fruit
 

и

Таблица B

 field 1 | field 2

orange  | fruit
lemon   | fruit 
 

И хотите вставить только строки из таблицы B в таблицу A, которые не совпадают в поле 1, чтобы таблица A стала:

Таблица A

 field1  | field2

orange  | fruit
apple   | fruit
lemon   | fruit
 

Я пробовал

 insert into tableA (field1, field2)
select field1, field2 from tableB
where not exists 
(select * from tableA as a join tableB as b on a.field1 = b.field1)
 

(без вставки)

и

 insert into tableA (field1, field2)
select field1, field2  from tableA as a left join tableB as b on a.field1 = b.field1  
union 
select field1, field2  from tableA as s right join tableB as b on a.field1 = b.field1 
where a.field1 != b.field1
 

(неправильная вставка)

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

1. Что-то вроде: INSERT INTO tableA (field1, field2) SELECT b.field1, b.field2 FROM tableA a LEFT JOIN tableB b USING field1 WHERE a.field1 IS NULL я думаю, это то, что вы ищете. Начните с определения нужного выбора (все строки из TableB, которых нет в TableA), а затем вставьте только эти строки.

2. вопрос uri trymysql:lab2017:basicops:uu579distantaystipulate

Ответ №1:

У вас не совсем NOT EXISTS правильное выражение, оно должно смотреть на значение, из tableB которого вы пытаетесь вставить:

 INSERT INTO tableA (field1, field2)
SELECT field1, field2 
FROM tableB b
WHERE NOT EXISTS (SELECT * FROM tableA a WHERE a.field1 = b.field1)
 

Вывод SELECT * FROM tableA после этого запроса:

 field1  field2
orange  fruit
apple   fruit
lemon   fruit
 

Демонстрация на db-fiddle

Ответ №2:

вы можете просто использовать union для этого или использовать приведенный ниже код

 INSERT INTO Table A SELECT * FROM Table B
WHERE NOT EXISTS (SELECT 1 FROM TABLE A Data
                  WHERE A.field1 = Data.field1 AND 
                  A.field2 = Data.field2)
 

Ответ №3:

Вероятно, это не лучшее решение, но это решение с использованием объединений сработало для меня:

 INSERT INTO A(F1,F2)
SELECT * 
FROM A NATURAL RIGHT JOIN B AS TAB
WHERE TAB.F1 NOT IN (
SELECT F1
FROM A NATURAL JOIN B
);