Запрос MS Access, функция IIF возвращает ошибку как «Не задано значение для одного или нескольких обязательных параметров» - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть запрос на доступ, который выполняет функции объединения, группировки, получения максимума, левого соединения и IIF (isNull). enter image description here Мне нужно объединить три подтаблицы и сгруппировать по столбцу "mainid", получить максимальное значение из столбца "time" как "MaxSubTime", а столбец mainid фильтруется по mainTable.id. Затем я подаю заявку на участие в MainTable в Union-Group. Если MaxSubTime равен Null, тогда я применяю MainTable.endtime к MaxSubTime и получаю его как «MaxMainTableEndTime». пока здесь все работает нормально.

string myQry = "SELECT MainTable.id, MainTable.sttime, IIF(IsNULL(a.MaxSubTime), MainTable.endtime, a.MaxSubTime) AS MaxMainTableEndTime 
            FROM (MainTable LEFT JOIN (SELECT mainid, MAX(SubTime) AS MaxSubTime 
            FROM (SELECT Sub_table_1.mainid, Sub_table_1.time AS SubTime FROM Sub_table_1 
                  UNION SELECT Sub_table_2.mainid, Sub_table_2.time AS SubTime Sub_table_2 
                  UNION SELECT Sub_table_3.mainid, Sub_table_3.time AS SubTime Sub_table_3 GROUP BY mainid) AS a ON a.mainid = MainTable.id)                       
            WHERE MaxMainTableEndTime >= #" + DateTime.Now + "# ";

Но когда я фильтрую окончательный запрос по "MaxMainTableEndTime", я получаю эту ошибку "Не задано значение для одного или нескольких обязательных параметров". Где я делаю мистику?

1 Ответ

0 голосов
/ 13 апреля 2020

Я решил эту проблему, используя предложение «Имея» и немного отредактировав мой код

string myQry = "SELECT MainTable.id, MainTable.sttime, a.MaxSubTime
FROM MainTable LEFT JOIN (SELECT mainid, MAX(SubTime) AS MaxSubTime
FROM(SELECT Sub_table_1.mainid, Sub_table_1.time AS SubTime FROM Sub_table_1 
UNION SELECT Sub_table_2.mainid, Sub_table_2.time AS SubTime Sub_table_2
UNION SELECT Sub_table_3.mainid, Sub_table_3.time AS SubTime Sub_table_3 
GROUP BY mainid HAVING MaxSubTime >= #" + DateTime.Now + "#)
AS a ON a.mainid = MainTable.id) WHERE MainTable.endtime >= #" + DateTime.Now + "# "
...