【问题标题】:How to UPDATE a row everytime after a new entry is added to a table through INSERT INTO?每次通过 INSERT INTO 将新条目添加到表后如何更新一行?
【发布时间】:2022-11-02 01:37:12
【问题描述】:

我有两个表:“SingleTable”和“SummaryTable” 然后有一个函数可以汇总 SingleTable 中的一些条目并将其写入 SummaryTable。

每次插入 SummaryTable 条目时,也会有 Summary Key 作为属性(不是 pk,不是唯一的)。 现在我想在每个汇总的 SingleTable 条目中写入创建的汇总键。

创建 SummaryTable 条目(例如):

INSERT INTO SummaryTable
(some column names) 
SELECT DISTINCT
(some column names)
FROM SingleTable
WHERE
(some criteria)

我写了这样的东西来获取最新创建的摘要键:

UPDATE SingleTable
SET summarykey =
(SELECT summarykey 
FROM SummaryTable
WHERE id = @@IDENTITY
)
WHERE
(some criteria)

但据我了解,每次创建摘要时我都必须运行它,而不是在 INSERT INTO 语句完成后运行它。

知道怎么做吗?

【问题讨论】:

  • 听起来像是非常适合 DML 触发器的任务...?
  • 我支持这个触发器的概念。但要小心使用@@identity。您应该改用SCOPE_IDENTITY。无论您做什么,都要确保您的触发器是基于不使用标量变量设置的。
  • 身份不相关,您将加入 inserted
  • 为什么有一个汇总表,而不是一个汇总VIEW?那你不需要每次到UPDATE另一张桌子。

标签: sql sql-server rapidsql


【解决方案1】:

这听起来像是 OUTPUT 子句的一个例子!

这是一个例子:

DECLARE @table TABLE (ID INT IDENTITY, Txn_Date DATE, Count INT)
DECLARE @NewIDs TABLE (ID INT, Txn_Date DATE)
INSERT INTO @table (Txn_Date, Count)
OUTPUT Inserted.ID, Inserted.Txn_Date INTO @NewIDs

VALUES
('2020-01-01', 3),
('2020-01-04', 3),
('2020-01-05', 2),
('2020-01-10', 1),
('2020-01-18', 3),
('2020-01-20', 2),
('2020-01-24', 2),
('2020-01-28', 1)

SELECT *
  FROM @NewIDs
ID  Txn_Date
------------
1   2020-01-01
2   2020-01-04
3   2020-01-05
4   2020-01-10
5   2020-01-18
6   2020-01-20
7   2020-01-24
8   2020-01-28

让我们分解一下。首先我们声明两个表变量,@table 是我们想要插入的一些真实表的占位符(例如你的SummaryTable)。 我们插入其中,但在我们提供值之前,我们定义了一个 OUTPUT 子句。在这种情况下,我们只对列 ID 和 Txn_Date 感兴趣。我们可以将它们定向到一个表(或者在这种情况下是另一个表变量),然后在不插入的情况下继续。

现在我们有了插入到表中的值,我们可以将其用于我们可能想做的任何其他事情。您可以继续使用聚合更新表,例如:

UPDATE @someOtherTable
   SET aCol = NewRowCount
  FROM (
        SELECT COUNT(*) AS NewRowCount FROM @NewIDs
       ) a

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 2022-01-10
    相关资源
    最近更新 更多