使用 GROUP BY 在 TRIGGER 中创建临时表

Posted

技术标签:

【中文标题】使用 GROUP BY 在 TRIGGER 中创建临时表【英文标题】:Creating a temporary table within a TRIGGER with GROUP BY 【发布时间】:2016-11-15 05:09:32 【问题描述】:

我需要在触发器中创建和使用带有GROUP BY 子句的临时表,但这样做有困难。

我的尝试:

这里我尝试使用两个临时表,它们在触发器结束后被删除。

首先我创建一个#Temptable 和触发器。

CREATE TABLE #TempTable (admID smallint, diagID smallint);

CREATE TRIGGER tr_newTest
ON Adm_Diag
FOR INSERT
AS
BEGIN
...
END

由于插入的表仅包含当前INSERTUPDATE 语句的行,我将几个INSERTUPDATE 语句传递给#TempTable

DECLARE @admID smallint
SELECT @admID = Adm_ID
FROM inserted

DECLARE @diagID smallint
SELECT @diagID=Diag_ID
FROM inserted

INSERT INTO #TempTable VALUES (@admID, @diagID)

现在有了这些数据,我想创建一个临时表,将#TempTable 的行分组:

SELECT *
INTO #TempGroupTable
FROM
(
    SELECT admID, COUNT(*) as Diag
    FROM #TempTable
    GROUP BY admID
) t1
WHERE Diag > 2

整个脚本

CREATE TABLE #TempTable (admID smallint, diagID smallint);

CREATE TRIGGER tr_newTest
ON Adm_Diag
FOR INSERT
AS
BEGIN

    DECLARE @admID smallint
    SELECT @admID = Adm_ID
    FROM inserted

    DECLARE @diagID smallint
    SELECT @diagID=Diag_ID
    FROM inserted

    INSERT INTO #TempTable VALUES (@admID, @diagID)

    -- Below I'm tring to create #TempGroupTable

    SELECT *
    INTO #TempGroupTable
    FROM
    (
        SELECT admID, COUNT(*) as Diag
        FROM #TempTable
        GROUP BY admID
    ) t1
    WHERE Diag > 2

END

执行触发器后出现错误:

消息 208,级别 16,状态 0,第 41 行无效的对象名称 '#TempGroupTable'。

如何创建#TempGroupTable

【问题讨论】:

你为什么不使用物理表而不是临时表。带有# 的临时表在会话之外无法工作。 @TanjimRahman 我不需要在会话之外使用临时表。正如我所说,仅在触发期间。 使用双井号,##TempGroupTable 当您的触发器工作时,它不会获得单个 # 临时表。正如@Rene 所说,您要么使用物理表,要么使用## @Jazz 这段代码,这个想法和接受的答案确实很糟糕。除非只是为了调试目的。 【参考方案1】:

不确定您要做什么,但以## 开头的全局临时表是否适合您?那么将#TempGroupTable 改成##TempGroupTable

【讨论】:

【参考方案2】:

为什么不免除临时表和变量的所有开销?试试:

CREATE TRIGGER tr_newTest
ON Adm_Diag
INSTEAD OF INSERT
AS
BEGIN

INSERT INTO Adm_Diag (adminID, Diag)
SELECT admID, COUNT(*) as Diag
FROM inserted
GROUP BY admID

END

【讨论】:

以上是关于使用 GROUP BY 在 TRIGGER 中创建临时表的主要内容,如果未能解决你的问题,请参考以下文章

SQL:在 GROUP BY 中使用 SELECT 中的别名

使用 group by 汇总列并存储为 MySQL 中的新列(永久)

SQL 服务器中的 UNION 和 GROUP BY

mysql group by,两个条件,限制1

带有 GROUP BY 的这个 MySQL 视图的 MS 版本?

mysql group by,两个条件,限制1