【问题标题】:MS Access SQL UPDATE using multiple tables使用多个表的 MS Access SQL UPDATE
【发布时间】: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


【解决方案1】:

您可以将WHERE 子句简化为:

WHERE table3.[TOS] = '7' AND
      table2.[stateID] = table3.[stateID] AND
      table1.[zip] BETWEEN table2.[zip_start] AND table2.[zip_end];

我想知道 MS Access 是否在同一行报告多个更新。

【讨论】:

  • 我绝对可以压缩 WHERE 子句,我遇到的问题是表 3。基本上带有 TOS '7' 的 StateID 会返回各种行,因为我想忽略的其他字段存在差异加入。
  • 因此,当我运行 SELECT DISTINCT cf, stateID from table3 INNER JOIN table1 ON left(table3.stateID,2) = table1.state WHERE table3.TOS = "7" 时,我得到了我想要使用的值,但不确定如何在更新中控制该值
猜你喜欢
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
相关资源
最近更新 更多