2016-07-28 4 views
1

Итак, у меня есть таблица с именем customers, и в этой таблице есть места, где заполняется столбец zip, но столбец state - нет.Как скопировать данные из одной строки в другую в SQL

Мы можем разумно предположить, что если у нас есть еще один клиент с как zip и state колонка заполнены, и zip соответствует клиенту без state заполненных, что клиент не state заполненных может быть это заполнен тем же значением, другой соответствующий клиент.

Цель состоит в том, чтобы заполнить недостающие значения, когда мы их знаем в другой строке.

Пример:

 BEFORE:       AFTER: 
/====================\   /====================\ 
| id | zip | state |   | id | zip | state | 
|----|-------|-------|   |----|-------|-------| 
| 0 | 12345 | FL | ==> | 0 | 12345 | FL | 
| 1 | 67890 | CA | ==> | 1 | 67890 | CA | 
| 2 | 67890 |  | ==> | 2 | 67890 | CA | 
| 3 | 12345 |  |   | 3 | 12345 | FL | 
| 4 | 10101 |  |   | 4 | 10101 |  | 
\====================/   \====================/ 

Мой вопрос: Как я могу использовать MySQL обновить таблицу и заполнить недостающие данные из другой строки?

До сих пор у меня есть SQL для поиска недостающих значений:

SELECT * 
FROM customers 
WHERE country = 'united states' 
    AND (zip <> '' OR zip IS NOT NULL) 
    AND (state = '' OR state IS NULL) 
+0

вам нужно 'update' таблицы или просто нужно 'select'? –

+0

Мне нужно обновить таблицу –

ответ

1

Вы можете сделать это следующим образом:

UPDATE customers 

INNER JOIN customers AS updateValues ON updateValues.zip = customers.zip AND updateValues.state IS NOT NULL AND updateValues.state != '' 

SET customers.state = updateValues.state 

WHERE (customers.zip <> '' AND customers.zip IS NOT NULL) 
AND (customers.state = '' OR customers.state IS NULL) 

(не знаю, где WHERE country = 'united states' был из, поэтому я удалил его)

+0

Страна должна быть указана, потому что данная база данных сильно загрязнена. –

2

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

update my_table as a 
inner join source_table as b on a.zip = b.zip 
set a.state = b.state 
where b.state is not null 
or b.state = '' 
AND country = 'united states' ; 
1

Я бы этого не сделал.

https://en.wikipedia.org/wiki/List_of_ZIP_code_prefixes

Первые 3 цифры почтового индекса указывают на состояние это. Я хотел бы сделать некоторую логику, основанную на этом.

Edit: Это не должно быть слишком сложным

UPDATE CUSTOMERS 
SET STATE = CASE 
       WHEN SUBSTRING(zip, 1,3) IN ('448','449', ect....) THEN 'OH' 
       .... 
       .... 
      END 
WHERE STATE IS NULL 
+0

Хотя вы правы, это в целом лучшая идея, у меня ограниченное количество времени, и это будет чрезвычайно подробный SQL. +1 –

+0

Я отредактировал его, чтобы отразить то, что я говорю лучше, поскольку это был неприемлемый ответ, очевидно – JDro04

0

Не уверен, что производительность, но вы должны быть в состоянии:

update table_name tn1 
    set tn1.state = (select max(tn2.state) from table_name tn2 where tn2.zip = tn1.zip and tn2.state is not null) 
where tn1.state is null 
Смежные вопросы