我尝试在Microsoft Access 2010中使用子查询。以下是表格"表1":
ID data
--------
1 abc
2 def
子查询有两种可能的用法:
SELECT ID
FROM (SELECT ID FROM Table1) AS tmp
WHERE tmp.ID > 1
它有效,并给出正确的结果ID = 2.但是,
SELECT ID
FROM (SELECT ID FROM Table1) AS tmp
WHERE EXIST (SELECT ID FROM tmp WHERE ID > 1)
给出以下错误:
Microsoft Access数据库引擎无法找到输入表或查询' tmp'。确保它存在并且其名称拼写正确。
它不是使用子查询的好例子,但我需要在更复杂的情况下引用子查询的结果,例如:
SELECT Temp.rating
FROM (
SELECT S.rating, AVG(S.age) AS avgage
FROM Sailors S
GROUP BY S.rating) AS Temp
WHERE Temp.avgage = (
SELECT MIN(Temp.avgage)
FROM Temp)
此类错误的原因是什么以及如何解决?
答案 0 :(得分:1)
有很多简单的方法可以做你想要的事情。
例如,您的第二个查询可以像这样重构:
Select
top 1 s.rating, avg(s.age) as avgage
from
sailors s
group by s.rating
order by avg(s.age)
这为您提供了按其评级分组的水手的最低平均年龄。
如果必须使用subselect,请尝试:
SELECT rating, min(avgage)
FROM (
SELECT S.rating, AVG(S.age) AS avgage
FROM Sailors S
GROUP BY S.rating) AS Temp
在答案的第一部分中,您提供此查询:
SELECT ID
FROM (SELECT ID FROM Table1) AS tmp
WHERE EXIST (SELECT ID FROM tmp WHERE ID > 1)
这会引发语法错误,因为tmp在exists中超出范围。
我认为你的意思是做这样的事情,虽然我不确定这是否有意义:
SELECT ID
FROM Table1 AS tmp
WHERE EXIST (SELECT
1
FROM
Table1 tmp2
WHERE tmp.Id = tmp2.ID
and tmp2.Id > 1)
请注意,两个表(tmp
和tmp2
)之间的自联接发生在exists中。