我有一个CTE,可以拆分记录,计算天数,生成ID和historicLicMed
上的许多其他报表内容,该要求专门要求将CTE的结果存储在常规表中。为此,我修改了CTE,使其在此新表中有一个INSERT into
,问题是由于某种原因,插入操作由于以前的原因而在记录上已拆分的记录上执行了两次,结果是该表存储的原始记录量约为原始记录的3倍(从30k到80k,如果没有插入的cte会产生5万条记录)。
原始表中的示例数据:
ID IDHIST INI END DD
--- ------- -------- -------- ---
1 x 20180101 20180205 36
cte本身的功能以及应该粘贴到新表中的内容:
ID IDHIST INI END DD
--- ------- -------- -------- --
1 x 20180101 20180131 31
2 x 20180202 20180205 5
带有插入物的cte会做什么:
ID IDHIST INI END DD
--- ------- -------- -------- --
1 x 20180101 20180131 31
2 x 20180202 20180205 5
3 x 20180101 20180131 31
4 x 20180202 20180205 5
这是整个cte,感谢您对INSERT语句中的任何帮助。
;WITH N(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY [object_id])-1 FROM SYS.ALL_COLUMNS
),
D(N,F,T,MD,BP,EP,
--COLUMNAS TABLA ORIGINAL HISTORICOLICMED
VALIDO,IDHIST,ID_HR,TIPO,ID_TIPO,NOM_INC,RUT,NOMBRE,ID_EMP,NOM_POS,DIAS_DURAC,INI,FIN,NUM_LIC,ID_USU_ACT,ULT_ACT) AS
(
SELECT n.N,d.INI,d.FIN,
DATEDIFF(MONTH, d.INI, d.FIN),
DATEADD(MONTH, n.N, DATEADD(DAY, 1-DAY(INI), INI)),
DATEADD(DAY, -1, DATEADD(MONTH, 1, DATEADD(MONTH, n.N,
DATEADD(DAY, 1-DAY(INI), INI)))),
--COLUMNAS TABLA ORIGINAL
D.VALIDO,D.IDHIST,D.ID_HR,D.TIPO,D.ID_TIPO,D.NOM_INC,D.RUT,D.NOMBRE,D.ID_EMP,D.NOM_POS,D.DIAS_DURAC,D.INI,D.FIN,D.NUM_LIC,D.ID_USU_ACT,D.ULT_ACT
FROM N INNER JOIN HISTORICOLICMED AS D
ON d.FIN >= DATEADD(MONTH, n.N-1, d.INI)
), E AS (
SELECT VALIDO,IDHIST,ID_HR,TIPO,ID_TIPO,NOM_INC,RUT,NOMBRE,ID_EMP,NOM_POS,INI,FIN,NUM_LIC,ID_USU_ACT,ULT_ACT, --dias_durac
--columnas originales INI / FIN
CONVERT(NVARCHAR(10),f, 103) as original_INI, CONVERT(NVARCHAR(10),t, 103) as original_FIN, DIAS_DURAC,
--columnas con ampliación
CONVERT(NVARCHAR(10), CASE n WHEN 0 THEN f ELSE bp END,103) AS nuevo_INI,
--new_INI = CASE n WHEN 0 THEN f ELSE bp END,
CONVERT(NVARCHAR(10), CASE n WHEN md THEN t ELSE ep END,103) AS nuevo_FIN
--new_INI = CASE n WHEN md THEN t ELSE bp END
FROM D
WHERE MD >= N
), I AS (
SELECT E.*,
DATEDIFF(DD, NUEVO_INI,NUEVO_FIN)+1 as DIAS_DURAC2,
CONVERT(nvarchar(6),CAST(nuevo_ini as datetime),112) as PERPRO
FROM E --ORDER BY IDHIST
)
INSERT INTO DBO.HISTORICOLICMEDPROC
(VALIDO,IDHIST,ID_HR,TIPO,ID_TIPO,NOM_INC,RUT,NOMBRE,ID_EMP,NOM_POS,INI,FIN,NUM_LIC,ID_USU_ACT,ULT_ACT,ORIGINAL_INI,ORIGINAL_FIN,DIAS_DURAC,NUEVO_INI,NUEVO_FIN,DIAS_DURAC2,PERPRO)
SELECT E.VALIDO,E.IDHIST,E.ID_HR,E.TIPO,E.ID_TIPO,E.NOM_INC,E.RUT,E.NOMBRE,E.ID_EMP,E.NOM_POS,E.INI,E.FIN,E.NUM_LIC,E.ID_USU_ACT,E.ULT_ACT,E.ORIGINAL_INI,E.ORIGINAL_FIN,E.DIAS_DURAC,E.NUEVO_INI,E.NUEVO_FIN,I.DIAS_DURAC2,I.PERPRO
FROM E LEFT JOIN I ON E.IDHIST = I.IDHIST
GO
答案 0 :(得分:0)
这是联接出现问题,只是调用了最后一个表并重命名了最后2个变量,所以我可以一次调用everithing。
SELECT E.VALIDO,E.IDHIST,E.ID_HR,E.TIPO,E.ID_TIPO,E.NOM_INC,E.RUT,E.NOMBRE,E.ID_EMP,E.NOM_POS,E.INI,E.FIN,E.NUM_LIC,E.ID_USU_ACT,E.ULT_ACT,E.ORIGINAL_INI,E.ORIGINAL_FIN,E.DIAS_DURAC,E.NUEVO_INI,E.NUEVO_FIN,E.DIAS_DURAC2,E.PERPRO
FROM I AS E