【问题标题】:How to copy data from one row to another in SQL如何在 SQL 中将数据从一行复制到另一行
【发布时间】:2025-11-26 04:45:01
【问题描述】:

所以我有一个名为customers 的表,在该表中有一些地方填写了zip 列,但没有填写state 列。

我们可以合理地假设,如果我们有另一个客户同时填写了 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)

【问题讨论】:

  • 您需要update 表还是只需要select
  • 我需要更新表格

标签: php mysql sql phpmyadmin


【解决方案1】:

你可以使用更新和内连接

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' ;

【讨论】:

    【解决方案2】:

    你可以这样做:

    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' 来自哪里,所以我删除了它)

    【讨论】:

    • 必须指定国家,因为相关数据库污染严重。
    【解决方案3】:

    我不会这样做。

    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
    

    【讨论】:

    • 虽然您是对的,但总体而言这是一个更好的主意,但我的时间有限,而且这将是非常冗长的 SQL。 +1
    • 我已经对其进行了编辑以更好地反映我所说的,因为这显然不是一个可以接受的答案
    【解决方案4】:

    不确定性能,但您应该能够:

    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
    

    【讨论】: