更新和自连接以及case语句-哦,天哪

s4chpxco  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(439)

我想我可能是想用一个问题做太多了,这让我很紧张。
我有两个表,源代码和邮政编码。源表的邮政编码字段可以是3位或5位数字。
如果是3位数字,我需要连接到邮政编码表的3位字段,并将源代码的新邮政编码字段设置为邮政编码表对应的5位条目。
如果是5位数字,我需要链接到zip代码表的5位字段(以确保它是有效的邮政编码),然后将该5位数字放在源代码的新\u zip字段中。
我已经了解到您不能操作正在更新的内容,因此使用自连接来操作副本。所以现在我需要创建source2,并连接source1、source2和zip代码表。

  1. UPDATE SOURCE1
  2. INNER JOIN SOURCE2 ON SOURCE1_UID = SOURCE2_UID
  3. INNER JOIN ZIP_CODE ON SOURCE1_ZIP =
  4. (
  5. SELECT
  6. (
  7. CASE WHEN LENGTH(SOURCE1.ZIP <4
  8. THEN ZIP_CODE.3_DIGIT
  9. ELSE ZIP_CODE.5_DIGIT
  10. END
  11. )
  12. FROM SOURCE2
  13. )
  14. SET SOURCE1.NEW_ZIP =
  15. (
  16. CASE WHEN LENGTH(SOURCE1.ZIP <4
  17. THEN ZIP_CODE.3_DIGIT
  18. ELSE ZIP_CODE.5_DIGIT
  19. END
  20. )

我知道我做错了什么,但我不知道该怎么办。

sycxhyv7

sycxhyv71#

你不是在命名 Source 查询中的表。您需要给表命名,然后给它一个别名,如 Source1 如果你要看两遍的话。
但我不认为有任何必要的自我加入。
不需要子查询,您可以在 ON 条款。

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

你的描述说你总是想 new_zip 5位代码,所以不需要 CASESET 条款。

相关问题