更新和自我连接和案例陈述 - 哦,我的
Updates and Self Joins and Case Statements - oh my
我想我可能试图对一个查询做太多事情,这让我很抓狂。
我有两个 table,Source 和 Zip_Code。 Source table 有一个邮政编码字段,可以是 3 位或 5 位数字。
如果是3位数,我需要加入zip_code table的3位数字段,并将Source的new_zip字段设置为zip_code table 对应的 5 位数条目。
如果是 5 位数,我需要 link 到 zip_code table 的 5 位数字段(以确保它是一个有效的邮政编码),然后把它来源的 new_zip 字段中的 5 位数字。
我已经了解到您无法操纵正在更新的内容,因此使用自联接来操纵副本。所以现在我需要创建 Source2,并加入 Source1、Source2 和 Zip_Code tables。
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
)
我知道我做错了一些大事,但我不知道错在哪里。
您没有在查询中命名 Source
table。你需要命名 table 然后给它一个像 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 位代码,因此 SET
子句中不需要 CASE
。
我想我可能试图对一个查询做太多事情,这让我很抓狂。
我有两个 table,Source 和 Zip_Code。 Source table 有一个邮政编码字段,可以是 3 位或 5 位数字。
如果是3位数,我需要加入zip_code table的3位数字段,并将Source的new_zip字段设置为zip_code table 对应的 5 位数条目。
如果是 5 位数,我需要 link 到 zip_code table 的 5 位数字段(以确保它是一个有效的邮政编码),然后把它来源的 new_zip 字段中的 5 位数字。
我已经了解到您无法操纵正在更新的内容,因此使用自联接来操纵副本。所以现在我需要创建 Source2,并加入 Source1、Source2 和 Zip_Code tables。
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
)
我知道我做错了一些大事,但我不知道错在哪里。
您没有在查询中命名 Source
table。你需要命名 table 然后给它一个像 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 位代码,因此 SET
子句中不需要 CASE
。