Вот вопрос: я получаю ошибку "Недопустимая операция" в запросе LEFT JOIN и, хотя я думаю, что могу определить поле, вызывающее проблему, я не могу понять, почему и что нужно сделать, чтобы исправить это. Что мне не хватает / что мне нужно изменить, чтобы заставить его работать?
Я работаю с 4 связанными таблицами, которые входят в 2 разных запроса выбора (ex_Step1 и ex_Step2), а затем эти 2 запроса переходят в третий запрос (ex_Step3). Когда я пытаюсь выполнить третий запрос, я получаю ошибку "Недопустимая операция". Я не изменяю никакие исходные данные за исключением следующих случаев:
Switchдля перевода из сгенерированного системой кода в имя проекта для удобства чтенияSumчтобы сложить два разных числаTrimчтобы удалить конечные пробелы из номера рабочего задания
Вот объяснение того, что запросы должны делать:
- У нас есть NCR (записи о несоответствии), которые могут создать WO (рабочее задание) для выполнения некоторого ремонта или переделки, исправляя любую проблему.
- Не каждый NCR создает WO, и не каждый WO создается NCR
- В таблице NCR есть поле для создания WO, а также другая информация о NCR.
- В таблице WO есть запись всех часов, потраченных на выполнение работы, но нет поля, для которого ее создал номер NCR
- Я должен связать данные NCR и данные WO на основе номера WO
- Я хочу извлечь все часы для каждой WO, созданной NCR, и связать это с датой закрытия NCR.
ex_Step1извлекает данные о каждой WO, номер которой начинается сNпоскольку каждая WO, созданная NCR, получает номер, начинающийся сNex_Step2извлекает данные о каждом NCR, связанном с рабочим заданием , которое начинается сNex_Step3должен тянуть в каждой записи изex_Step1и, если WO появится номерex_Step2он должен тянуть в информации NCR , как номер, дата создания и дата окончания- В том случае, если WO начинается с
Nи не имеет соответствующей записи в таблице NCR, я планирую использовать полеDATE_MCвex_Step1, но я не получил достаточно далеко для того , чтобы быть проблемой еще.
Вот некоторые вещи, которые я обнаружил, основываясь на устранении неполадок, которые я уже сделал, и некоторые соображения:
- Ошибка возникает только тогда, когда
ex_Step3используетLEFT JOINсex_Step1слева. Обычное соединение не является проблемой, и соединение сex_Step2слева не является проблемой. JOINнаходится в поляхex_Step1.tWO_NBRиex_Step2.tWO_NK. (Две базовые связанные таблицы имели разные имена для одних и тех же данных)- Это два поля с примененным к ним
Trim(вex_Step1иex_Step2), потому что в одной таблице есть завершающие пробелы, а в другом нет, поэтому объединение работало только с удаленными пробелами. - Если я использую
LEFT JOINно не включаю записи из правой таблицы (ex_Step2), тогдаex_Step3запускается без ошибок. Я предполагаю, что это потому, что он игнорирует соединение, так как мы извлекаем данные только из левой таблицы. - Я попытался заключить оператор
ONв скобки - как показано в SQL ниже - но безрезультатно
Вот SQL для запросов. Я очистил данные, чтобы удалить названия проектов, но я не внес никаких других изменений. Для ex_Step1:
SELECT WDS17_ORD.STKRM, Switch([STKRM]="14","Proj1",[STKRM]="16","Proj2",[STKRM]="26","Proj3",[STKRM]="28","Proj4") AS Project, Trim([WO_NBR]) AS tWO_NBR, WDS17_LDD.WO_ACCT, WDS17_ORD.DATE_MC, Sum([WDS17_LDD]![HRS_REG]+[WDS17_LDD]![HRS_OT1]) AS Hours
FROM WDS17_LDD RIGHT JOIN WDS17_ORD ON WDS17_LDD.WO_ACCT = WDS17_ORD.WO_NBR
GROUP BY WDS17_ORD.STKRM, Switch([STKRM]="14","Proj1",[STKRM]="16","Proj2",[STKRM]="26","Proj3",[STKRM]="28","Proj4"), Trim([WO_NBR]), WDS17_LDD.WO_ACCT, WDS17_ORD.DATE_MC
HAVING (((WDS17_ORD.STKRM)="14" Or (WDS17_ORD.STKRM)="16" Or (WDS17_ORD.STKRM)="26" Or (WDS17_ORD.STKRM)="28") AND ((Trim([WO_NBR])) Like "N*") AND ((Sum([WDS17_LDD]![HRS_REG]+[WDS17_LDD]![HRS_OT1]))>0))
ORDER BY Switch([STKRM]="14","Proj1",[STKRM]="16","Proj2",[STKRM]="26","Proj3",[STKRM]="28","Proj4"), WDS17_ORD.DATE_MC DESC , Sum([WDS17_LDD]![HRS_REG]+[WDS17_LDD]![HRS_OT1]) DESC;
... и для ex_Step2:
SELECT Trim([REWORK_WO_NK]) AS tWO_NK, DW_OWNER_NCM_DISP_REWORK_WO_FACT.NCR_NUMBER_NK AS NCR_NUMBER, DW_OWNER_NCM_NCR.DATE_CREATE, DW_OWNER_NCM_NCR.DATE_CLOSE
FROM DW_OWNER_NCM_DISP_REWORK_WO_FACT INNER JOIN DW_OWNER_NCM_NCR ON DW_OWNER_NCM_DISP_REWORK_WO_FACT.NCM_NCR_SK = DW_OWNER_NCM_NCR.NCM_NCR_SK
GROUP BY Trim([REWORK_WO_NK]), DW_OWNER_NCM_DISP_REWORK_WO_FACT.NCR_NUMBER_NK, DW_OWNER_NCM_NCR.DATE_CREATE, DW_OWNER_NCM_NCR.DATE_CLOSE
HAVING (((Trim([REWORK_WO_NK])) Like "N*"))
ORDER BY DW_OWNER_NCM_NCR.DATE_CREATE, DW_OWNER_NCM_NCR.DATE_CLOSE;
... и для ex_Step3:
SELECT ex_Step1.STKRM, ex_Step1.Project, ex_Step1.tWO_NBR, ex_Step1.WO_ACCT, ex_Step1.DATE_MC, ex_Step1.Hours, ex_Step2.NCR_NUMBER, ex_Step2.DATE_CREATE, ex_Step2.DATE_CLOSE
FROM ex_Step1 LEFT JOIN ex_Step2 ON (ex_Step1.tWO_NBR = ex_Step2.tWO_NK);
