我对以下查询有疑问
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”,我们将不胜感激。
答案 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