使用Microsoft Access 2010在子查询中找不到的表

时间:2014-11-04 21:16:34

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

我尝试在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)

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

1 个答案:

答案 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)

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