2017-01-13 5 views
0

У меня есть две таблицы с адресными данными. Вот частичное изображение:MySQL: Получить список повторяющихся значений между таблицами

таблица 1 (основные данные):

id address  city  state 
1 1234 main st seattle wa 
2 2345 oak st portland or 
3 3456 maple st boise  id 

и в таблице 2 (вторичные данные):

id address   city   state to_insert 
1 4567 first st sacramento ca  1 
2 5678 second st phoenix  az  0 
3 2345 oak st  portland  or  1 

мне нужно сначала получить список значений из таблицы 2, которые помечены как to_insert (бит), которые уже существуют в таблице 1, поэтому я могу вручную редактировать данные и вставлять их (чтобы они не дублировались). Как получить список дубликатов из таблицы 2 (вторичные данные), которые уже существуют в таблице 1 (основные данные)?

+0

Являются ли адреса одинаковыми? Или у него могут быть разные символы (в этом случае это будет очень сложно) –

+0

Они точно такие же – divided

+0

Используйте 'insert ignore ...' вместо простой' insert ... ' – Shadow

ответ

1

Вы можете использовать EXISTS, чтобы получить повторяющиеся строки на table2:

SELECT * FROM table2 t2 WHERE EXISTS (
    SELECT * FROM table1 
    WHERE t2.address = table1.address 
     AND t2.city = table1.city 
     AND t2.state = table1.state 
); 

Вы можете найти рабочий пример здесь:http://sqlfiddle.com/#!9/110b9a/1/0

К INSERT данные от table2 к table1 вы можете использовать следующие:

INSERT INTO table1 (address, city, state) 
SELECT address, city, state FROM table2 
WHERE NOT id IN (
    SELECT t2.id FROM table2 t2 WHERE EXISTS (
     SELECT * FROM table1 
     WHERE t2.address = table1.address 
      AND t2.city = table1.city 
      AND t2.state = table1.state 
    ) 
); 
+1

Это не сработает, так как идентификаторы могут отличаться друг от друга. –

+0

Хотя ОП сказал, что он точно такой же ... Это может сработать. :) –

+0

Хорхе, вы правы - если я так делаю, он возвращает список адресов, которые не все дублируются (фактические адреса не существуют в таблице 1). Идентификаторы различаются между таблицами, но фактические данные адреса одинаковы. – divided

0

Сделайте SELECT с предложением GROUP BY. Скажем, имя столбца вы хотите найти дубликаты в:

SELECT name, COUNT(*) c FROM table GROUP BY name HAVING c > 1; 

Это возвращает результат со значением имени в первом столбце, а подсчет, сколько раз кажется, что значение во втором.

+0

Дубликаты не входят в одну таблицу. Плз снова прочитал вопрос. – Shadow

1

Вы можете использовать вставку выбрать с не подвыборки

insert into table1 (address , city , state) 
select address, city, state 
from table2 
where (address , city , state) not in (select address, city, state from table1) 
+0

Возможно, вам не хватает 'in' после' not'. Однако, если это действительно ответ, тогда эта тема является дубликатом и должна быть закрыта как таковая. – Shadow

+0

@Shadow спасибо в добавленные – scaisEdge

1

, если вы хотите, чтобы эти значения, которые не дублируют

insert into table1 select * from table2 where 
row(id,address,city,state) not in (select * from table1); 

, если вы хотите, чтобы эти значения, которые являются дубликатом

insert into table1 select * from table2 where 
row(id,address,city,state) in (select * from table1); 
Смежные вопросы