MS Access: как использовать вычисляемое поле в подзапросе? - PullRequest
1 голос
/ 25 января 2011

У меня проблема со следующим запросом

Select A.PName, (B.Hours+C.Hours) as TotalHours,   
(select top 1 grade from TableD where TableD.HoursRequire >=**TotalHours**)  
from TableA A  
left join TableB B on A.Pname=B.Pname  
left join TableC C on A.Pname=C.Pname

Моя проблема в том, что вычисляемое поле «Всего часов» не распознается в подзапросе, любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 25 января 2011

Получите ли вы то, что хотите, используя выражение поля (B.Hours + C.Hours) в подзапросе вместо псевдонима TotalHours?

Select A.PName, (B.Hours+C.Hours) as TotalHours,
(select top 1 grade from TableD where TableD.HoursRequire >= (B.Hours+C.Hours))
from TableA A
left join TableB B on A.Pname=B.Pname
left join TableC C on A.Pname=C.Pname

Однако, если вы используете левые объединения, и я подозреваю, что для строк, в которых B.Hours или C.Hours равно Null, вы ничего не получите из подзапроса, поскольку B.Hours + C.Hours будут равны Null и TableD.HoursRequire >= Null никогда не будет оцениваться как True. Здесь может быть полезна функция Nz ().

Редактировать: @cyberwiki находится на Re Top 1 без ORDER BY. Извините, что пропустил это.

Почему у вас есть часы, разделенные на 2 таблицы (TableB и TableC)? Покажите нам пример данных из этих таблиц.

Edit2: Если нецелесообразно объединять часы в одну физическую таблицу, вы все равно можете сделать это с «виртуальной» таблицей, используя запрос Union.

Сохраните это как qryUnionHours:

SELECT Pname, Hours
FROM TableB
UNION ALL
SELECT Pname, Hours
FROM TableC;

Затем вы можете использовать qryUnionHours в качестве источника данных для запроса GROUP BY, qryHoursPerPerson, который суммирует часы для каждого человека.

SELECT Pname, Sum(Hours) AS TotalHours
FROM qryUnionHours
GROUP BY Pname;

На самом деле вы можете предпочесть один запрос, который включает в себя SQL из qryUnionHours в качестве подзапроса. Я сделал это с 2, потому что я думал, что это может быть проще для понимания и менее подвержены синтаксическим ошибкам. Все, что вам нужно сделать, это интегрировать ваши оценки, как мы обсуждали в другой ветке.

0 голосов
/ 25 января 2011

Используйте все выражение. ТОП 1 также не имеет смысла без ORDER BY, если вы не хотите случайную оценку.

Select A.PName, (B.Hours+C.Hours) as TotalHours,
    (select top 1 grade from TableD
     where TableD.HoursRequire >= B.Hours+C.Hours
     order by grade desc)
from TableA A
left join TableB B on A.Pname=B.Pname
left join TableC C on A.Pname=C.Pname

Вы также можете сначала запросить его

SELECT PName, TotalHours,
    (select top 1 grade from TableD
     where TableD.HoursRequire >= TotalHours
     order by grade desc)
FROM (
    Select A.PName, (B.Hours+C.Hours) as TotalHours
    from TableA A
    left join TableB B on A.Pname=B.Pname
    left join TableC C on A.Pname=C.Pname
) AS SUBBED
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...