从单个 CTE 一起使用 INSERT 和/或 UPDATE

ari*_*ios 5 sql sql-server sql-server-2008

我正在尝试使用名为的 cte 查询 cte,s4并根据结果插入或更新到另一个表eventslog。我无法在单个查询中执行此操作,需要先将数据插入临时表中。我想摆脱对临时表部分的插入,直接插入或更新它。

我想我不止一次调用那个 cte 有问题。有解决办法吗?如何通过查询单个 cte 插入或更新表?非常感谢任何帮助。

SQL;

 ,ss4 
 AS (SELECT DISTINCT h.groupid, 
                     h.eventid, 
                     Sum(h.vcheck) AS tot ,
                     max(h.eventtime) as eventtime
     FROM   ss3 h 
     GROUP  BY h.groupid, 
               h.eventid
               ) 
INSERT INTO @glo 
            (eventtime, 
             eventid, 
             groupid, 
             vcheck) 
SELECT DISTINCT i.eventtime, 
                i.eventid, 
                i.groupid, 
                i.tot 
FROM   ss4 i 


INSERT INTO eventslog 
            (eventtime, 
             eventid, 
             groupid) 
SELECT DISTINCT j.eventtime, 
                j.eventid, 
                j.groupid 
FROM   @glo j 
WHERE    
  j.vcheck = 0 
  AND NOT EXISTS(SELECT eventid 
                 FROM   eventslog 
                 WHERE  eventid = j.eventid 
                        AND groupid = j.groupid 
                        AND clearedtime IS NULL)   


UPDATE k 
SET    k.clearedtime = l.eventtime 
FROM   eventslog k 
       RIGHT JOIN @glo l 
               ON k.groupid = l.groupid 
                  AND k.eventid = l.eventid 
WHERE  l.vcheck > 0 
       AND  k.groupid = l.groupid
Run Code Online (Sandbox Code Playgroud)

Rya*_*vin 6

我最近自己也在做类似的事情。我使用合并语句来处理使用 CTE 执行插入或更新。

下面的例子:

;WITH cte AS
(

   SELECT id,
          name
     FROM [TableA]
)

MERGE INTO [TableA] AS A
     USING cte
        ON cte.ID = A.id

      WHEN MATCHED 
      THEN UPDATE
       SET A.name = cte.name

      WHEN NOT MATCHED 
      THEN INSERT
    VALUES(cte.name);
Run Code Online (Sandbox Code Playgroud)


Rez*_*eza 2

您可以使用MergeSQL 2008 中提供的命令,

这里有一个非常好的教程 http://www.made2mentor.com/2013/05/writing-t-sql-merge-statements-the-right-way/