2015-02-09 221 views
1

我正在尝试在Access中创建子查询,但我收到一个错误消息,指出可以通过此子查询返回一条记录。我想找到宠物最多的前10家公司,然后我想知道那些宠物的名字。我从来没有创建过一个子查询,所以我不确定我的错在哪里。以下是我有:在Access中创建子查询

SELECT TOP 10 dbo_tGovenrnmentRegulatoryAgency.GovernmentRegulatoryAgency 
(SELECT dbo_tPet.Pet 
FROM dbo_tPet) 

FROM dbo_tPet INNER JOIN dbo_tGovenrnmentRegulatoryAgency ON 
dbo_tPet.GovernmentRegulatoryAgencyID = 
dbo_tGovenrnmentRegulatoryAgency.GovernmentRegulatoryAgencyID 
GROUP BY dbo_tGovenrnmentRegulatoryAgency.GovernmentRegulatoryAgency 
ORDER BY Count(dbo_tPet.PetID) DESC; 

回答

1

考虑这一点的解决方案,需要一个子查询WHERE IN()子句中:

SELECT t1.GovernmentRegulatoryAgency, dbo_tPet.Pet, 
FROM dbo_tPet 
INNER JOIN dbo_tGovenrnmentRegulatoryAgency t1 ON 
dbo_tPet.GovernmentRegulatoryAgencyID = t1.GovernmentRegulatoryAgencyID  
WHERE t1.GovernmentRegulatoryAgency IN 
    (SELECT TOP 10 t2.GovernmentRegulatoryAgency 
    FROM dbo_tPet 
    INNER JOIN dbo_tGovenrnmentRegulatoryAgency t2 ON 
    dbo_tPet.GovernmentRegulatoryAgencyID = t2.GovernmentRegulatoryAgencyID 
    GROUP BY t2.GovernmentRegulatoryAgency 
    ORDER BY Count(dbo_tPet.Pet) DESC); 

表的别名是不需要的,但我有他们的演示。

0

这样应该可以做到这一点:

SELECT a.GovernmentRegulatoryAgency, t.NumOfPets 
FROM dbo_tGovenrnmentRegulatoryAgency a 
INNER JOIN (
    SELECT TOP 10 p.GovernmentRegulatoryAgencyID, COUNT(p.PetID) AS NumOfPets 
    FROM dbo_tPet p 
    GROUP BY p.GovernmentRegulatoryAgencyID 
    ORDER BY COUNT(p.PetID) DESC 
) t 
ON a.GovernmentRegulatoryAgencyID = t.GovernmentRegulatoryAgencyID 

简而言之,首先要使嵌套查询排序,确定有关机构是什么,然后内部连接回代理表来获取所选机构的详细信息。

+1

不争议这个答案,但值得一提的是,Access中的嵌套查询通常非常慢(可惜,因为在几乎所有基于服务器的系统中,这绝对不是这种情况,嵌套查询被认为是最佳实践,因为它们明晰)。您可以将其重写为单个聚合查询。 – 2015-02-10 01:08:34

+0

@BenMcIntyre - 继续,然后测试结果。 – 2015-02-10 19:45:41