2016-07-28 91 views
1

因此,我有一個名爲customers的表,在該表中有一些地方填寫了zip列,但是列state不是。如何在SQL中將數據從一行復制到另一個

我們可以合理地假設,如果我們有其他客戶同時與zipstate欄填寫,並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'表或你只需要一個'選擇'? –

+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位指示其處於狀態。我想以此爲基礎進行一些邏輯。

編輯:這並不一定是太複雜

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 
相關問題