更新和自我加入以及案例陈述-哦,我的

时间:2018-09-27 16:52:53

标签: mysql sql-update mysql-workbench self-join case-statement

我想我可能只想对一个查询做太多事情,这一直在推动着我前进。

我有两个表,Source和Zip_Code。 Source表的邮政编码字段可以是3位或5位数字。

如果是3位数字,我需要加入zip_code表的3位数字字段,并将Source的new_zip字段设置为zip_code表的相应5位数字条目。

如果是5位数字,我需要链接到zip_code表的5位数字字段(以确保它是有效的邮政编码),然后将该5位数字放入Source的new_zip字段中。

我已经了解到您无法操作要更新的内容,因此可以使用自联接操作副本。因此,现在我需要创建Source2,并联接Source1,Source2和Zip_Code表。

UPDATE SOURCE1
INNER JOIN SOURCE2 ON SOURCE1_UID = SOURCE2_UID
INNER JOIN ZIP_CODE ON SOURCE1_ZIP =
   (   
    SELECT
      (
       CASE WHEN LENGTH(SOURCE1.ZIP <4
       THEN ZIP_CODE.3_DIGIT
       ELSE ZIP_CODE.5_DIGIT
       END
       )
    FROM SOURCE2
    ) 

SET SOURCE1.NEW_ZIP = 
 (
  CASE WHEN LENGTH(SOURCE1.ZIP <4
  THEN ZIP_CODE.3_DIGIT
  ELSE ZIP_CODE.5_DIGIT
  END
  )

我知道我做的主要是错误的事情,但是我在哪里有一个障碍。

1 个答案:

答案 0 :(得分:1)

您没有在查询中命名Source表。您需要命名该表,然后给它一个别名,例如Source1,如果您必须两次引用它。

但是我认为不需要自我加入。

不需要子查询,可以在ON子句中使用条件。

UPDATE Source AS s
JOIN Zip_Code AS z ON 
    CASE WHEN LENGTH(s.zip) = 3
        THEN z.3_digit
        ELSE z.5_digit
    END
SET s.new_zip = z.5_digit

您的描述表明,您始终希望将new_zip设置为5位代码,因此在CASE子句中不需要SET