Запрос SQL Access: Как получить Id из подзапроса с использованием LEFT JOIN

Вопросы и ответы

Я работаю с запросом 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;

Объяснение изменений:

  1. Извлечение RegulationId напрямую: Я добавил подзапрос для RegulationId прямо в основной выбор данных, чтобы он выполнялся вместе с запросом, а не внутри вашего LEFT JOIN, что может вызывать путаницу.

  2. Устранение вложенного подзапроса: Вместо того чтобы использовать вложенный подзапрос для поиска RegelDgId, использовать прямой выбор из таблицы dbo_RegelDg, чтобы уменьшить сложность и потенциальные ошибки.

  3. Правильно установить условия WHERE: Я оставил ваше оригинальное условие, что B.RegelDgId IS NULL, это позволит вам получить результаты, у которых нет соответствий в присоединяемой таблице.

Обязательно проверьте:

  • Пути к базам данных: Убедитесь, что пути к вашим базам данных в запросе правильные и доступные.
  • Ничто из условий не генерирует ошибку "Enter Parameter Value": Это может быть вызвано отсутствием необходимых полей или некорректными именами.

Попробуйте этот измененный SQL-запрос, и он должен исправить ваши проблемы с получением RegulationId.

Оцените материал
Добавить комментарий

Капча загружается...