【问题标题】:How to update numerical column of one table based on matching string column from another table in SQL如何根据SQL中另一表的匹配字符串列更新一个表的数字列
【发布时间】:2020-06-23 01:58:27
【问题描述】:

我想根据来自另一个表的匹配字符串列更新一个表的数字列。即, 我有一个包含 5 个字符串(或文本)列和 10 个数字列的 100 条记录的表(比如说 table1)。现在我有另一个具有相同结构(列)和 20 条记录的表。在这种情况下,很少有记录包含 table1 的更新数据,即这些记录的数值列值已更新,其余部分是新的(文本和数值列)。

我想更新具有相同文本列(在 table1 中)的记录的数字列,并将 table2 中的新数据插入到 table1 中,其中文本列也是新的。

我想取这两个表的交集然后更新,但无法弄清楚如何更新数字列的逻辑。

注意:我没有任何主键或唯一键列。

请在这里帮忙。 提前致谢。

【问题讨论】:

  • 请以表格形式提供样本数据和所需结果。这将比仅用文字描述问题更有帮助。

标签: sql postgresql


【解决方案1】:

最简单的解决方案是使用两个单独的查询,例如:

UPDATE b
SET b.[NumericColumn] = a.[NumericColumn],
  etc...
FROM [dbo].[SourceTable] a
JOIN [dbo].[DestinationTable] b
  ON a.[StringColumn1] = b.[StringColumn1]
  AND a.[StringColumn2] = b.[StringColumn2] etc...

INSERT INTO [dbo].[DestinationTable] (
  [NumericColumn],
  [StringColumn1],
  [StringColumn2],
  etc...
)
SELECT a.[NumericColumn],
  a.[StringColumn1],
  a.[StringColumn2],
  etc...
FROM [dbo].[SourceTable] a
LEFT JOIN [dbo].[DestinationTable] b
  ON a.[StringColumn1] = b.[StringColumn1]
  AND a.[StringColumn2] = b.[StringColumn2] etc...
WHERE b.[NumericColumn] IS NULL
  --assumes that [NumericColumn] is non-nullable.
  --If there are no non-nullable columns then you
  --will have to structure your query differently

如果您使用的是不经常更改且不担心高争用的小型数据集,这将非常有效。

这种方法仍然存在许多问题 - 最明显的是如果在更新语句运行时访问和/或修改源表或目标表会发生什么。其中一些问题可以通过其他方式解决,但很大程度上取决于表的使用环境,因此很难提供更有效的通用解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多