MS Access:如何在子查询中使用计算字段?

时间:2011-01-25 19:45:53

标签: sql ms-access

我对以下查询有疑问

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

我的问题是在子查询中无法识别计算字段“TotalHours”,我们将不胜感激。

2 个答案:

答案 0 :(得分:2)

使用子查询中的字段表达式(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并{{1永远不会评估为True。 Nz()函数在这里很有用。

编辑:@cyberwiki在Re Top 1上没有ORDER BY。对不起,我错过了。

为什么在两个表(TableB和TableC)之间分配小时数?向我们展示这些表中的一些样本数据。

Edit2:如果将Hours合并到一个物理表中是不切实际的,您仍然可以使用Union查询使用“虚拟”表来执行此操作。

将其保存为qryUnionHours:

TableD.HoursRequire >= Null

然后你可以使用qryUnionHours作为GROUP BY查询的数据源qryHoursPerPerson,它总计每个人的小时数。

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

实际上,您可能更喜欢将qryUnionHours中的SQL作为子查询合并的单个查询。我用2做了,因为我认为它可能更容易理解,更不容易出现语法错误。您需要做的就是整合您在其他主题中讨论的成绩分配。

答案 1 :(得分:0)

使用整个表达式。如果没有ORDER BY,TOP 1也没有意义,除非你想要一个随机等级。

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