太嵌套的循环sql,用完了内部资源

时间:2017-08-06 18:17:45

标签: sql sql-server

通过以下查询,我尝试选择日期(总共12个), 在一个表中,但满足某些限制,对于此查询 我有两块板连在一起用于一个dni:

1.-日期1(日期nac = 19-04-2016)如果此日期存在,则在7个月之前的6个月至2天之间搜索BD中的日期 更及时的日期= OPPORTUNO:25-10-2016。 如果您没有找到它,请查找6个月之间至35个月之前最多2天的日期(如果此日期存在) 把NO OPORTUNO和日期= NO OPORTUNO:06-05-2017。

2.-日期2根据前一日期查找日期(OPORTUNO:25-10-2016)> = 28天和< = 32天,如果存在的话 把ooportuno和日期= Oportuno:23-11-2016。 如果您没有找到它,请根据上一个日期查找日期(不是OPPORTUNE:06-05-2017)> = 30天和< = 929天,如果存在的话 没有oprtuno和日期= NO OPPORTUNO:13-07-2016。

2.-日期3根据前一日期寻找日期(OPORTUNO:23-11-2016)> = 28天和< = 32天,如果存在 把oportuno和日期= OPORTUNO:25-12-2016。 如果您没有找到它,请根据上一个日期查找日期(NOT OPORTUNO:13-07-2016)> = 30天和< = 929天,如果存在的话 没有oprtno和日期= NO OPORTUNO:10-28-2016。

并且在第12天到期之前,其他日期也是如此。

我所做的是将DATE 1的DATE 1置于条件状态,但是日期2嵌套在3 .....直到12日。 我跑到第7天但是从第8天开始显示错误:查询处理器耗尽了内部资源,无法生成查询计划。我将发布一个示例查询结果。

     (CASE   
            WHEN 

            EXISTS(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(DD ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI))),fecha) 
) BETWEEN 28 AND 32) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI )   

                THEN 
                (select concat('OPORTUNO: ',(Select CONVERT( VARCHAR, (SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(DD ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI))),fecha) 
) BETWEEN 28 AND 32) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI )))))


when

 EXISTS(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(day ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI))),fecha) 
) BETWEEN 30 AND 929) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI )

then 
(select concat('NO OPORTUNO: ',(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(day ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI))),fecha) 
) BETWEEN 30 AND 929) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI )))

                else ''
        END)  AS [FECHA 1 (SF)]
,
 (CASE   
            WHEN 
            EXISTS(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(DD ,(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(DD ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI))),fecha) 
) BETWEEN 28 AND 32) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI ),fecha) 
) BETWEEN 28 AND 32) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI )   

AND

EXISTS(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(DD ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI))),fecha) 
) BETWEEN 28 AND 32) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI )  
                THEN 
                (select concat('OPORTUNO: ',(Select CONVERT( VARCHAR, (SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(DD ,(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(DD ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI))),fecha) 
) BETWEEN 28 AND 32) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI ),fecha) 
) BETWEEN 28 AND 32) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI )))))

when 

EXISTS(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(day ,(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(day ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI))),fecha) 
) BETWEEN 30 AND 929) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI ),fecha) 
) BETWEEN 30 AND 929) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI )

then 
(select concat('NO OPORTUNO: ',(Select CONVERT( VARCHAR,(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(day ,(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(day ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI))),fecha) 
) BETWEEN 30 AND 929) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI ),fecha) 
) BETWEEN 30 AND 929) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI )))))

                else ''
        END)  AS [FECHA 2 (SF)]
,
 (CASE   
            WHEN 
EXISTS(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(DD ,(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(DD ,(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(DD ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI))),fecha) 
) BETWEEN 28 AND 32) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI ),fecha) 
) BETWEEN 28 AND 32) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI ),fecha) 
) BETWEEN 28 AND 32) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI )   
and
            EXISTS(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(DD ,(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(DD ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI))),fecha) 
) BETWEEN 28 AND 32) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI ),fecha) 
) BETWEEN 28 AND 32) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI )   



                THEN 
                (select concat('OPORTUNO: ',(Select CONVERT( VARCHAR, (SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(DD ,(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(DD ,(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(DD ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI))),fecha) 
) BETWEEN 28 AND 32) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI ),fecha) 
) BETWEEN 28 AND 32) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI ),fecha) 
) BETWEEN 28 AND 32) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI )))))

when 

EXISTS(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(day ,(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(day ,(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(day ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI))),fecha) 
) BETWEEN 30 AND 929) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI ),fecha) 
) BETWEEN 30 AND 929) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI ),fecha) 
) BETWEEN 30 AND 929) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI )

then 
(select concat('NO OPORTUNO: ',(Select CONVERT( VARCHAR,(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(day ,(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(day ,(SELECT top 1  FECHA FROM dbo.z298 WHERE 
                 ((DATEDIFF(day ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI))),fecha) 
) BETWEEN 30 AND 929) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI ),fecha) 
) BETWEEN 30 AND 929) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI ),fecha) 
) BETWEEN 30 AND 929) 
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO  DE IDENTIDAD 
DEL NIÑO] = dbo.z298.DNI )))))

                else ''
        END)  AS [FECHA 3 (SF)]

Imgage whit the table structure and the result of this query

1 个答案:

答案 0 :(得分:0)

我不了解你的算法,你为什么使用重叠范围([28-32],[30-929])而且我不确定这是不是一个好主意将所有时间从dateiffs转换为dateiffs几天,但整个解决方案可能如下所示:

    SELECT  z.dni,
            z.FECHA,
            CASE 
                 WHEN DATEDIFF(DAY, r.dt, z.FECHA) BETWEEN 28 AND 30 THEN 'asdf1'
                 WHEN DATEDIFF(DAY, r.dt, z.FECHA) BETWEEN 30 AND 929 THEN 'asdf2'
                      ...
            END
    FROM    dbo.z298 z   
            CROSS APPLY (
                    SELECT  TOP 1 DATEADD(MONTH, 5, r.[FECHA DE NACIMIENTO DEL NINO(DD/MM/AAAA)]) dt
                    FROM    dbo.REPORTE_ALTAS_BAJAS r
                    WHERE   r.[NUMERO DEL DOCUMENTO  DE IDENTIDAD DEL NINO] = z.DNI
                            AND r.[FECHA DE NACIMIENTO DEL NINO(DD/MM/AAAA)] <= DATEADD(MONTH, -6, z.FECHA)
                    ORDER BY dt DESC
                  ) r

也许必须将其还原:FROM REPORTE... CROSS APPLY (... FROM z298...)

我真的不确定术语&#34;嵌套日期&#34;适用于您的任务。但如果是,那么你可能想尝试二次CTE而不是制作子查询。