У меня есть Access 2003 с SQL-сервером.MSAccess запрос слишком длинный для выполнения
Этот запрос занимает 10 минут, и если я вывожу часть Exists, это займет 10 секунд.
Я не могу поместить его в SQL в качестве транзитного запроса, потому что он мне нужен в подзаголовке Access.
Любые идеи, как улучшить время выполнения?
SELECT DailyLeaveLedger.dldEmployeeID,
Sum(IIf([tolAnnualLeaveType]<>0,1,0)) AS ALDays,
Sum(IIf([tolPersonalLeaveType]<>0,1,0)) AS PLDays,
Sum(IIf([tolPublicHolidayType]<>0,1,0)) AS PHDays,
DailyLeaveLedger.dldPHID
FROM (DailyLeaveLedger
INNER JOIN Employees ON DailyLeaveLedger.dldEmployeeID = Employees.EmployeeID)
INNER JOIN TypeOfLesterLeave ON DailyLeaveLedger.dldLeaveType = TypeOfLesterLeave.tolID
WHERE (((DailyLeaveLedger.dldAuthDecline)=1) AND
((DailyLeaveLedger.dldAuthorisedBy) Is Not Null) AND
((DailyLeaveLedger.dldReleaseToPayroll)=True) AND
((IIf([forms]![TransferTBRToPayrollForm]![chkOnlyPayLeave]=True,
Exists (SELECT DISTINCT InvoiceHeader.InvDate
FROM (InvoiceHeader
INNER JOIN ReceiptDetail ON InvoiceHeader.InvNumber = ReceiptDetail.RDInvNumber)
INNER JOIN [Work Codes] ON ReceiptDetail.RDWorkCodeID = [Work Codes].WorkCodeID
WHERE ((ReceiptDetail.RDPayRun=0 Or
ReceiptDetail.RDPayRun Is Null) AND
(ReceiptDetail.RDRctToPayrollFlag=0) AND
([Work Codes].WorkCodePayrollAccount1<>0) AND
(InvoiceHeader.EmployeeID = DailyLeaveLedger.dldEmployeeID) AND
(DailyLeaveLedger.dldLeaveDate > DateAdd("ww", -InvoiceHeader.InvWeeksOfPay, InvoiceHeader.InvBeginDate)) AND
(DailyLeaveLedger.dldLeaveDate <= InvoiceHeader.InvBeginDate)))
,True))=True))
GROUP BY DailyLeaveLedger.dldEmployeeID, DailyLeaveLedger.dldPHID
HAVING (((DailyLeaveLedger.dldPHID) Is Null));
Что заставляет вас думать, что сквозной запрос запрещает использовать его в подзаголовке? Не то чтобы это важно, так как это, вероятно, будет так же плохо, как прохождение. – JohnFx
Я вижу, что вы сейчас говорите. В запросе есть встроенные элементы управления, которые препятствуют работе сквозного доступа. Однако у вас большие проблемы.Предложение Exists, вложенное в iif, означает, что оно выполняется в каждой строке. Вы собираетесь переработать это, чтобы избавиться от существующего и iif-блока. Если вы объясните, что он пытается сделать, я смогу помочь вам переработать его. – JohnFx
Он пытается выбрать дни отпуска из таблицы, и существует только для того, чтобы выбрать оставить строки, в которых отпуск находится в диапазоне счета-фактуры. т.е. время, на которое распространяется счет, если это имеет смысл. – Malcolm