Вот вопрос: я получаю ошибку "Недопустимая операция" в запросе 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, получает номер, начинающийся сN
ex_Step2
извлекает данные о каждом NCR, связанном с рабочим заданием , которое начинается сN
ex_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);