Я работаю с запросом Access, который включает в себя несколько баз данных. Запрос извлекает данные из основной таблицы и выполняет LEFT JOIN, чтобы получить RegulationDgId из другой таблицы. Мне также нужно извлечь ID ([_COMMON_Regel].[ID]) из подзапроса, но у меня возникают трудности с тем, чтобы он отображался в результатах. Вот запрос, с которого я начал:
SELECT 'ADG' AS Regel, A.[0_DgmId_ADG]
FROM [I:\mstrdb\mstrdb\ADG.mdb].[_ADG_mt] AS A
LEFT JOIN (
SELECT RegelDgId
FROM [I:\mstrdb\ldb\DgDataWork.mdb].[dbo_RegelDg]
WHERE RegelId = (
SELECT TOP 1 C.ID
FROM (
SELECT TOP 2 C.ID
FROM [I:\mstrdb\mstrdb\cdata.mdb].[_COMMON_Regel] AS C
WHERE C.RegelTypeID = 1
AND (C.EndDate IS NULL OR C.EndDate > Date())
ORDER BY C.ID DESC
) AS SubQuery
ORDER BY C.ID ASC
)
) AS B
ON A.[0_DgmId_ADG] = B.RegelDgId
WHERE B.RegelDgId IS NULL
AND (
SELECT COUNT(*)
FROM (
SELECT TOP 2 C.ID
FROM [I:\mstrdb\mstrdb\cdata.mdb].[_COMMON_Regel] AS C
WHERE C.RegelTypeID = 1
AND (C.EndDate IS NULL OR C.EndDate > Date())
ORDER BY C.ID DESC
) AS SubQuery
) > 1;
Моя цель:
Я хочу извлечь RegulationId из подзапроса и отобразить его в конечном результате вместе с A.[0_DgmId_ADG]. Однако мои попытки либо приводили к пустым столбцам RegulationId, либо к ошибкам (например, “Введите значение параметра” для C2.ID).
Что я пробовал:
Изменение JOIN, чтобы включить RegulationId в подзапрос.
Упоминание псевдонима для RegulationId в разных частях запроса.
Использование различных форм LEFT JOIN и INNER JOIN для правильного связывания таблиц и подзапросов.
Что нужно:
Как я могу изменить этот запрос, чтобы успешно извлечь и отобразить RegulationId без ошибок или пустых столбцов?
Любая помощь или предложения будут оценены!
Ответ
Чтобы успешно извлечь RegelDgId
из подзапроса в вашем запросе Access SQL и отобразить его в финальном результате alongside A.[0_DgmId_ADG]
, вам нужно изменить структуру вашего запроса, чтобы правильно включить RegelDgId
и убедиться в том, что соответствует ссылочное поле. Вот как можно переписать ваш запрос:
SELECT 'ADG' AS Regel, A.[0_DgmId_ADG],
(SELECT TOP 1 C.ID
FROM [I:\mstrdb\mstrdb\cdata.mdb].[_COMMON_Regel] AS C
WHERE C.RegelTypeID = 1
AND (C.EndDate IS NULL OR C.EndDate > Date())
ORDER BY C.ID DESC) AS RegulationId
FROM
[I:\mstrdb\mstrdb\ADG.mdb].[_ADG_mt] AS A
LEFT JOIN
[I:\mstrdb\ldb\DgDataWork.mdb].[dbo_RegelDg] AS B
ON
A.[0_DgmId_ADG] = B.RegelDgId
WHERE
B.RegelDgId IS NULL
AND
(SELECT COUNT(*)
FROM (
SELECT TOP 2 C.ID
FROM [I:\mstrdb\mstrdb\cdata.mdb].[_COMMON_Regel] AS C
WHERE C.RegelTypeID = 1
AND (C.EndDate IS NULL OR C.EndDate > Date())
ORDER BY C.ID DESC
) AS SubQuery) > 1;
Объяснение изменений:
-
Извлечение
RegulationId
напрямую: Я добавил подзапрос дляRegulationId
прямо в основной выбор данных, чтобы он выполнялся вместе с запросом, а не внутри вашегоLEFT JOIN
, что может вызывать путаницу. -
Устранение вложенного подзапроса: Вместо того чтобы использовать вложенный подзапрос для поиска
RegelDgId
, использовать прямой выбор из таблицыdbo_RegelDg
, чтобы уменьшить сложность и потенциальные ошибки. - Правильно установить условия
WHERE
: Я оставил ваше оригинальное условие, чтоB.RegelDgId IS NULL
, это позволит вам получить результаты, у которых нет соответствий в присоединяемой таблице.
Обязательно проверьте:
- Пути к базам данных: Убедитесь, что пути к вашим базам данных в запросе правильные и доступные.
- Ничто из условий не генерирует ошибку "Enter Parameter Value": Это может быть вызвано отсутствием необходимых полей или некорректными именами.
Попробуйте этот измененный SQL-запрос, и он должен исправить ваши проблемы с получением RegulationId
.