多次删除并左加入CTE

问题描述 投票:0回答:1

我在存储过程中需要多次使用CTE,一次用于删除,三次用于左连接,我在下面标记。我读到我不应该多次查询 CTE。有人可以建议我如何重写代码吗?谢谢

我的SP代码:

WITH T1 AS   
(
  SELECT ID, Event, SN, Note
FROM je
WHERE je.Event in ('1601','1602') 
AND DATE(Time) = DATE_ADD(current_date(), INTERVAL -1 DAY)
) 
, T2 AS 
(
    SELECT SELECT ID, Event, SN, Note
      ,ROW_NUMBER() OVER (PARTITION BY ID, case when Note like '%@%' and Event='1602' then 'Y' else 'N' end ORDER BY SN DESC) AS Sort
      ,ROW_NUMBER() OVER (PARTITION BY ID, case when Note like '%@%' then 'Y' else 'N' end ORDER BY SN DESC) AS SortI1
    FROM T1
)
DELETE * FROM A Where ID in (SELECT ID from T2)  --#1

INSERT INTO A(
.
.
)
SELECT 
.
.
FROM G
Left Join (SELECT DISTINCT ID, Event FROM T2) k1 --#2
on G.ID=k1.ID
Left Join (SELECT ID, Event, Note like '%@%' FROM T2 where Event='1602') k2 --#3
on G.ID=k2.ID
Left Join (SELECT ID, Event, Note not like '%@%' FROM T2 where Event in ('1601','1602')) k3 --#4
on G.ID=k3.ID
WHERE k1.Event in ('1601','1602')
;
sql sql-server stored-procedures
1个回答
0
投票

在 Microsoft Sql-Server 中,您可以将结果选择到临时别名而不是 CTE 中,并根据需要继续使用。由于 TEMP 表在当前会话期间可用,因此这可能就是您所需要的。例如:

SELECT 
      ID, 
      Event, 
      SN, 
      Note
   into 
      -- the # denotes a TEMP table
      #T1
   FROM 
      je
   WHERE 
          je.Event in ('1601','1602') 
      AND DATE(Time) = DATE_ADD(current_date(), INTERVAL -1 DAY);


SELECT 
      ID, 
      Event, 
      SN, 
      Note,
      ROW_NUMBER() OVER (PARTITION BY ID, 
                       case when Note like '%@%' and Event='1602' 
                            then 'Y' else 'N' end ORDER BY SN DESC) AS Sort,
      ROW_NUMBER() OVER (PARTITION BY ID, 
                       case when Note like '%@%' 
                            then 'Y' else 'N' end ORDER BY SN DESC) AS SortI1
   into
      #T2
   FROM 
      #T1

DELETE FROM A Where ID in (SELECT ID from #T2)

INSERT INTO A(
   .
   .
)
SELECT 
      .
      .
   FROM 
      G
         Left Join (SELECT DISTINCT ID, Event 
                       FROM #T2) k1 --#2
            on G.ID = k1.ID
         Left Join (SELECT ID, Event, Note like '%@%' 
                       FROM #T2 
                       where Event='1602') k2 --#3
            on G.ID = k2.ID
         Left Join (SELECT ID, Event, Note not like '%@%' 
                       FROM #T2 
                       where Event in ('1601','1602')) k3 --#4
            on G.ID = k3.ID
   WHERE 
      k1.Event in ('1601','1602');
© www.soinside.com 2019 - 2024. All rights reserved.