【发布时间】:2021-01-25 21:01:45
【问题描述】:
我正在尝试使用表 2 和表 3 中的值更新表 1。表 1 和(表 2 和表 3)之间没有关系字段,因此我使用条件 WHERE 语句。我只想在 table3.TOS 为 7 时从表 3 中提取 CF,并在 table1.zip 介于或等于表 2 中的开始/结束邮政编码时从 table2.stateID 中提取区域部分。表 2 和表 3 相关stateID 字段。
此代码似乎有效,但运行 Access 时显示更新 5880 行,尽管表 1 只有 1471 行。我想知道我的代码中是什么导致这个数字如此膨胀,当我运行它时,表格看起来很好,数字正确。再次,此代码按原样运行,但告诉我它正在更新比预期更多的行。
UPDATE table1, table2, table3
SET table1.region = '00' + right(table2.[stateID],2),
table1.cf = table3.cf,
table1.eff_date = '2020-03-01'
WHERE (table3.[TOS] = '7' AND table2.[stateID] = table3.[stateID])
AND (table1.[zip] = table2.[zip_start]
OR table1.[zip] = table2.[zip_end]
OR (table1.[zip] BETWEEN table2.[zip_start] AND table2.[zip_end]));
【问题讨论】:
-
删除更新并替换为 Select *。这将提供 5880 行,您将看到您的联接有什么问题。可能 table1 有 State 列,您需要将其包含在联接中。
-
哦,我看到当我为所有三个选择 * 并过滤单个 zip 时,似乎有重复,但表 3 中还有其他字段存在差异,因此我需要压缩连接
-
Martin 更新运行的行数大约是原始行数的 4 倍。整理好后,您应该发布自己的答案。
-
在派生表而不是 table3 上使用更新连接可能会达到您的需要。选择 State 和 TOS 的不同组合以获得所需的更新次数。类似的请参见:dba.stackexchange.com/questions/19966/…
-
这就是我的想法,只需从表 3 创建一个派生表,该表具有我需要的不同值并加入该表
标签: sql ms-access sql-update where-clause