使用 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)

请注意,两个表(tmptmp2)之间的自连接发生在存在中。

【讨论】:

感谢您的回答。但是,为什么子查询中的范围与 WHERE 子句中的范围不同?有明确的规定吗? @YenChiHsuan,可能有支持该语法的平台,但 Access 不是其中之一。一般来说(mysql 作为一个明显的例外)别名不能用于查询的其他部分。

以上是关于使用 Microsoft Access 2010 在子查询中找不到表的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Access 2010 查询不产生任何结果

Microsoft Access 2010 打开目录中的所有文件

Microsoft Access 2010 中的自定义查询

Microsoft Access 2010 中的多个文本过滤器

Microsoft Access 2010 中不显示某些富文本格式 (HTML)

具有基于用户的安全性的 Microsoft Access 2010 (mdb) 自动化