Вот вопрос: я получаю ошибку "Недопустимая операция" в запросе 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 . (Две базовые связанные таблицы имели разные имена для одних и тех же данных)
  • Это два поля с примененным к ним Trimex_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);

1 ответ1

0

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


Я попытался выполнить полное внешнее объединение, как было предложено в комментариях, но не смог заставить его работать. Он изначально не реализован в Access 2010, и обнаруженные мной обходные пути оказались безуспешными. Моим возможным решением было настроить мои базовые запросы как запросы Make Table и использовать таблицы в качестве источника для моего третьего запроса. Для моей реализации этого было достаточно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .