我在存储过程中需要多次使用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')
;
在 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');