2017-08-06 36 views
-4

通過下面的查詢,我嘗試選擇一個DATES(總共12個), 在一個表格中,但符合一定的限制條件,對於這個查詢 我有兩個板連接在一起dni:太嵌套循環sql,耗盡內部資源

1.-日期1(date nac = 19-04-2016)在6個月大到7個月前的2天內搜索BD中的日期,如果存在該日期的話 更及時日期= OPPORTUNO:25-10-2016。 如果您找不到它,請在35個月之前查找6個月到2天之間的日期,如果存在此日期 請放棄OPORTUNO和日期= NO OPORTUNO:06-05-2017。

2.- DATE 2根據以前的日期查找一個日期(OPORTUNO:25-10-2016)> = 28天,< = 32天,如果存在 穿戴ooportuno和日期= Oportuno:23- 11-2016。 如果您沒有找到它,請根據上一個日期查找日期(NOT OPPORTUNE:06-05-2017)> = 30 DAYS和< = 929 DAYS(如果存在) 放入oprtuno並將日期= NO OPPORTUNO :13-07-2016。根據以前的日期

2.- DATE 3查找的日期(OPORTUNO:23-11-2016)> = 28天,< = 32天,如果EXISTS 穿戴oportuno和日期= OPORTUNO:25- 12-2016。 如果您沒有找到它,請根據上一個日期查找日期(不是OPORTUNO:13-07-2016)> = 30天和< = 929天,如果存在 放入oprtno並且日期= NO OPORTUNO :2016年10月28日。

及其在同樣的其他日期,直到你到達日期12.

我所做的就是窩日期1在DATE 2的條件,但嵌套在3日2 .....直到12。 我跑到DATE 7但從DATE 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

+0

我不知道你在這裏試圖做什麼,但它聽起來像你可能能夠從表中查詢單個日期,並從第一個查詢計算其他字段。你能否用純文本解釋查詢的邏輯,以更好地解釋你想要做什麼? – andrewec

+1

你想做什麼?給出示例數據和期望的結果。人們不應該首先破譯你複雜的代碼,找出你想要做的事情,並告訴你如何做得更好。 –

+0

由於您提出了建議,我將重新開始。首先,用你說的語言寫下你的目標。然後查看您的表結構以查看數據的位置。最後,開始編寫你的查詢。採取嬰兒的步驟。提前測試,經常測試。如果你認爲你需要一個循環,你可能是在錯誤的軌道上。 –

回答

0

我不明白你的算法,你爲什麼使用重疊範圍的想法([28-32],[30-929]),我不知道這是一個好主意,從datediffs切換所有的時間在一個月datediffs天,但整體的解決方案可能是這樣的:

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...)

我真的不確定術語「嵌套日期」是否適用於您的任務。但是,如果是這樣,那麼你可能想嘗試recourseive CTE而不是進行子查詢。