Условие множественного ИЛИ не работает в запросе соединения SQL - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь получить данные из запроса sql join.Запрос не работает, когда я использую фильтр даты с 3 комбинациями в предложении where.

 IF OBJECT_ID('tempdb..#tempAllocStatus1') IS NOT NULL
                         DROP TABLE #tempAllocStatus1 

                         SELECT  Users.Name,REPLACE(Staff.Designation, 'IND ', '') as Designation, Staff.Office as Location,
                                        (SELECT  COUNT(ReqDt.ID) FROM tblTPRequestDetail ReqDt  
                                        INNER JOIN  tblTPRequest Req ON ReqDt.RequestID = Req.Id 
                                        WHERE ReqDt.AssignedToID = Users.UserADID AND Req.TypeOfRequest = 1 AND ((ReqDt.StatusCode = 'COMP' or ReqDt.StatusCode = 'PCR') or (ReqDt.StatusCode = 'AWIP' and ReqDt.SubStatusCode='BENRE' or ReqDt.SubStatusCode='BENSF' or ReqDt.SubStatusCode='DRR' or ReqDt.SubStatusCode='DRSO' or ReqDt.SubStatusCode='RPSOFF'))) [Indian Benchmarking Assigned], 

                                        (SELECT  COUNT(ReqDt.ID) FROM tblTPRequestDetail ReqDt  
                                        INNER JOIN  tblTPRequest Req ON ReqDt.RequestID = Req.Id 
                                        WHERE ReqDt.ReviewerID = Users.UserADID AND Req.TypeOfRequest = 1 AND ((ReqDt.StatusCode = 'COMP' or ReqDt.StatusCode = 'PCR') or (ReqDt.StatusCode = 'AWIP' and ReqDt.SubStatusCode='BENSF' or ReqDt.SubStatusCode='DRSO' or ReqDt.SubStatusCode='RPSOFF' or SubStatusCode='RPC' or SubStatusCode='TPRPC'))) [Indian Benchmarking Reviewer], 

                                        (SELECT  COUNT(ReqDt.ID) FROM tblTPRequestDetail ReqDt  
                                        INNER JOIN  tblTPRequest Req ON ReqDt.RequestID = Req.Id 
                                        WHERE ReqDt.SignoffID = Users.UserADID AND Req.TypeOfRequest = 1 AND ((ReqDt.StatusCode = 'COMP' or ReqDt.StatusCode = 'PCR') or (ReqDt.StatusCode = 'AWIP' and ReqDt.SubStatusCode='RPSOFF' or ReqDt.SubStatusCode='SCPC' or ReqDt.SubStatusCode='TPSCPC'))) [Indian Benchmarking Signoff],

                                        (SELECT  COUNT(ReqDt.ID) FROM tblTPRequestDetail ReqDt  
                                        INNER JOIN  tblTPRequest Req ON ReqDt.RequestID = Req.Id 
                                        WHERE ReqDt.AssignedToID = Users.UserADID AND Req.TypeOfRequest = 1 AND ((ReqDt.StatusCode = 'COMP' or ReqDt.StatusCode = 'PCR') or (ReqDt.StatusCode = 'AWIP' and ReqDt.SubStatusCode='BENRE' or ReqDt.SubStatusCode='BENSF' or ReqDt.SubStatusCode='DRR' or ReqDt.SubStatusCode='DRSO' or ReqDt.SubStatusCode='RPSOFF'))) + 
                                        (SELECT  COUNT(ReqDt.ID) FROM tblTPRequestDetail ReqDt  
                                        INNER JOIN  tblTPRequest Req ON ReqDt.RequestID = Req.Id 
                                        WHERE ReqDt.ReviewerID = Users.UserADID AND Req.TypeOfRequest = 1 AND ((ReqDt.StatusCode = 'COMP' or ReqDt.StatusCode = 'PCR') or (ReqDt.StatusCode = 'AWIP' and ReqDt.SubStatusCode='BENSF' or ReqDt.SubStatusCode='DRSO' or ReqDt.SubStatusCode='RPSOFF' or SubStatusCode='RPC' or SubStatusCode='TPRPC'))) + 
                                        (SELECT  COUNT(ReqDt.ID) FROM tblTPRequestDetail ReqDt  
                                        INNER JOIN  tblTPRequest Req ON ReqDt.RequestID = Req.Id 
                                        WHERE ReqDt.SignoffID = Users.UserADID AND Req.TypeOfRequest = 1 AND ((ReqDt.StatusCode = 'COMP' or ReqDt.StatusCode = 'PCR') or (ReqDt.StatusCode = 'AWIP' and ReqDt.SubStatusCode='RPSOFF' or ReqDt.SubStatusCode='SCPC' or ReqDt.SubStatusCode='TPSCPC'))) [Indian Benchmarking Total],


                           (SELECT  COUNT(ReqDt.ID) FROM tblTPRequestDetail ReqDt 
                            WHERE ReqDt.AssignedToID = Users.UserADID AND ((ReqDt.StatusCode = 'COMP' or ReqDt.StatusCode = 'PCR') or (ReqDt.StatusCode = 'AWIP' and ReqDt.SubStatusCode='BENRE' or ReqDt.SubStatusCode='BENSF' or ReqDt.SubStatusCode='DRR' or ReqDt.SubStatusCode='DRSO' or ReqDt.SubStatusCode='RPSOFF'))) [All Assigned], 
                            (SELECT  COUNT(ReqDt.ID) FROM tblTPRequestDetail ReqDt 
                            WHERE ReqDt.ReviewerID = Users.UserADID AND ((ReqDt.StatusCode = 'COMP' or ReqDt.StatusCode = 'PCR') or (ReqDt.StatusCode = 'AWIP' and ReqDt.SubStatusCode='BENSF' or ReqDt.SubStatusCode='DRSO' or ReqDt.SubStatusCode='RPSOFF' or SubStatusCode='RPC' or SubStatusCode='TPRPC'))) [All Reviewer], 
                            (SELECT  COUNT(ReqDt.ID) FROM tblTPRequestDetail ReqDt 
                            INNER JOIN  tblTPRequest Req ON ReqDt.RequestID = Req.Id 
                            WHERE ReqDt.SignoffID = Users.UserADID AND ((ReqDt.StatusCode = 'COMP' or ReqDt.StatusCode = 'PCR') or (ReqDt.StatusCode = 'AWIP' and ReqDt.SubStatusCode='RPSOFF' or ReqDt.SubStatusCode='SCPC' or ReqDt.SubStatusCode='TPSCPC'))) [All Signoff],
                            (SELECT  COUNT(ReqDt.ID) FROM tblTPRequestDetail ReqDt 
                            WHERE ReqDt.AssignedToID = Users.UserADID AND ((ReqDt.StatusCode = 'COMP' or ReqDt.StatusCode = 'PCR') or (ReqDt.StatusCode = 'AWIP' and ReqDt.SubStatusCode='BENRE' or ReqDt.SubStatusCode='BENSF' or ReqDt.SubStatusCode='DRR' or ReqDt.SubStatusCode='DRSO' or ReqDt.SubStatusCode='RPSOFF'))) + 
                            (SELECT  COUNT(ReqDt.ID) FROM tblTPRequestDetail ReqDt 
                            WHERE ReqDt.ReviewerID = Users.UserADID AND ((ReqDt.StatusCode = 'COMP' or ReqDt.StatusCode = 'PCR') or (ReqDt.StatusCode = 'AWIP' and ReqDt.SubStatusCode='BENSF' or ReqDt.SubStatusCode='DRSO' or ReqDt.SubStatusCode='RPSOFF' or SubStatusCode='RPC' or SubStatusCode='TPRPC'))) + 
                            (SELECT  COUNT(ReqDt.ID) FROM tblTPRequestDetail ReqDt 
                            INNER JOIN  tblTPRequest Req ON ReqDt.RequestID = Req.Id 
                            WHERE ReqDt.SignoffID = Users.UserADID AND ((ReqDt.StatusCode = 'COMP' or ReqDt.StatusCode = 'PCR') or (ReqDt.StatusCode = 'AWIP' and ReqDt.SubStatusCode='RPSOFF' or ReqDt.SubStatusCode='SCPC' or ReqDt.SubStatusCode='TPSCPC'))) [All Total]

                            INTO #tempAllocStatus1

                            FROM tblUserRolesMapping Users

                                LEFT JOIN [tblstaff] Staff ON Users.UserADID = Staff.AD_Id                                  
                                LEFT JOIN tblTPRequestDetail UserAssigned ON UserAssigned.AssignedToID = Users.UserADID
                                LEFT JOIN tblTPRequestDetail UserReviewer ON UserReviewer.ReviewerID = Users.UserADID
                                LEFT JOIN tblTPRequestDetail UserSignoff ON UserSignoff.SignoffID = Users.UserADID

                                LEFT JOIN tblTPRequest TPRAssigned ON UserAssigned.RequestID = TPRAssigned.ID
                                LEFT JOIN tblTPRequest TPRReviewer ON UserReviewer.RequestID = TPRReviewer.ID
                                LEFT JOIN tblTPRequest TPRSignoff ON UserSignoff.RequestID = TPRSignoff.ID 

                            WHERE Users.Active = 1 and Users.[RoleId] !=6
                                      AND TPRAssigned.crtddate >= '2017-04-01'  and TPRAssigned.crtddate<= '2017-05-30'

                                      OR TPRReviewer.crtddate >= '2017-04-01'  AND TPRReviewer.crtddate<='2017-05-30'

                                      OR TPRSignoff.crtddate >= '2017-04-01'  AND TPRSignoff.crtddate<='2017-05-30' 
                                       GROUP BY Users.UserADID,  Users.Name, Staff.Designation,Staff.Office 

                                SELECT * FROM #tempAllocStatus1 WHERE [All Total] > 0

                                    UNION ALL

                                SELECT * FROM #tempAllocStatus1 WHERE [All Total] = 0 

И я сталкиваюсь с проблемой в следующих строках запроса.

                             AND TPRAssigned.crtddate >= '2017-04-01'  and TPRAssigned.crtddate<= '2017-05-30'

                                      OR TPRReviewer.crtddate >= '2017-04-01'  AND TPRReviewer.crtddate<='2017-05-30'

                                      OR TPRSignoff.crtddate >= '2017-04-01'  AND TPRSignoff.crtddate<='2017-05-30' 

Если я использую любую комбинацию из двух дат, это нормально работает.Если я добавлю третье условие даты, его загрузка в течение длительного времени и не получить никаких данных.Пожалуйста помоги.

1 Ответ

2 голосов
/ 24 сентября 2019

У вас есть проблема порядка операций, потому что AND имеет более высокий приоритет, чем OR.Используйте скобки для навязывания логики, которую вы намереваетесь:

WHERE
    ... AND
    (TPRAssigned.crtddate BETWEEN '2017-04-01' AND '2017-05-30') OR
    (TPRReviewer.crtddate BETWEEN '2017-04-01' AND '2017-05-30') OR
    (TPRSignoff.crtddate BETWEEN '2017-04-01' AND '2017-05-30')

Обратите внимание, что ваша текущая логика фактически оценивается как:

(TPRAssigned.crtddate >= '2017-04-01' AND TPRAssigned.crtddate <= '2017-05-30') OR
(TPRReviewer.crtddate >= '2017-04-01' AND TPRReviewer.crtddate <= '2017-05-30') OR
(TPRSignoff.crtddate >= '2017-04-01'  AND TPRSignoff.crtddate <= '2017-05-30')

Скорее всего, это не та логика, которую вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...