【问题标题】:Table not found in subquery using Microsoft Access 2010使用 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)

此类错误的原因是什么以及如何解决?

【问题讨论】:

  • 我的回答是努力纠正您在这里的一些误解。我不确定它是否直接回答了你的问题。您是否显示了您的具体查询以及您遇到的确切错误?

标签: sql ms-access subquery ms-access-2010


【解决方案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 作为一个明显的例外)别名不能用于查询的其他部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 2017-05-13
  • 2011-12-03
  • 1970-01-01
相关资源
最近更新 更多