使用 Microsoft Access 2010 在子查询中找不到表
Posted
技术标签:
【中文标题】使用 Microsoft Access 2010 在子查询中找不到表【英文标题】:Table not found in subquery using Microsoft Access 2010 【发布时间】:2014-11-04 21:16:33 【问题描述】:我正在尝试在 Microsoft Access 2010 中使用子查询。这是表“Table1”:
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)
此类错误的原因是什么以及如何解决?
【问题讨论】:
我的回答是努力纠正您在这里的一些误解。我不确定它是否直接回答了你的问题。您是否显示了您的具体查询以及您遇到的确切错误? 【参考方案1】:有很多更简单的方法可以按照您的建议进行操作。
例如,您的第二个查询可以这样重构:
Select
top 1 s.rating, avg(s.age) as avgage
from
sailors s
group by s.rating
order by avg(s.age)
这将为您提供按等级分组的水手的最低平均年龄。
如果您必须使用子选择尝试:
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 超出范围存在。
我认为你的意思是做这样的事情,虽然我不确定它是否有意义:
SELECT ID
FROM Table1 AS tmp
WHERE EXIST (SELECT
1
FROM
Table1 tmp2
WHERE tmp.Id = tmp2.ID
and tmp2.Id > 1)
请注意,两个表(tmp
和 tmp2
)之间的自连接发生在存在中。
【讨论】:
感谢您的回答。但是,为什么子查询中的范围与 WHERE 子句中的范围不同?有明确的规定吗? @YenChiHsuan,可能有支持该语法的平台,但 Access 不是其中之一。一般来说(mysql 作为一个明显的例外)别名不能用于查询的其他部分。以上是关于使用 Microsoft Access 2010 在子查询中找不到表的主要内容,如果未能解决你的问题,请参考以下文章
Microsoft Access 2010 查询不产生任何结果
Microsoft Access 2010 打开目录中的所有文件
Microsoft Access 2010 中的多个文本过滤器