2015-11-10 2 views
0

У меня есть две таблицы. Table A - главный стол, а table B - вспомогательная таблица. Теперь мне нужно скопировать из table B в table A только строки с aux_id нет в table AСкопируйте уникальные данные из одной таблицы в другую

TABLE_A

id |aux_id | firstname | lastname 

TABLE_B

aux_id | firstname | lastname 

То, что я пытаюсь, но, видимо, безуспешно.

INSERT INTO table_A(aux_id,firstname,lastname)(SELECT aux_id,firstname,lastname FROM table_B WHERE aux_id != aux_id); 

Я получаю: INSERT 0 0

Это неправильно, потому что я уверен, что у меня есть новые записи в таблице В.

ответ

6

Есть много способов сделать это (left join, not exists, not in). Если вы изучаете SQL, NOT IN, может быть самым простым на первой встрече:

INSERT INTO table_A(aux_id, firstname, lastname) 
    SELECT aux_id, firstname, lastname 
    FROM table_B 
    WHERE b.aux_id NOT IN (SELECT a.aux_id FROM table_A a); 

Я должен сказать, что я предпочитаю NOT EXISTS:

WHERE NOT EXISTS (SELECT 1 FROM table_A a WHERE a.aux_id = b.aux_id); 

Причина связана с обработкой NULL значений , NOT EXISTS делает то, что вы ожидаете. NOT IN никогда не возвращает true, если подзапрос возвращает значение NULL.

+0

спасибо. В чем смысл «SELECT 1»? – user455318

+1

это немного более эффективно. SELECT 1 не требует, чтобы postgresql назначил набор результатов, что делает SELECT *. И поскольку мы проверяем, есть ли какие-либо результаты, усилия по назначению бесполезны. – byMike

Смежные вопросы