选择找到IF倍数

时间:2010-10-08 15:28:30

标签: sql ms-access

我正在两个表之间进行内部连接,其中一个是关联表,因此存在多对一关系。我试图提出一个查询,可以决定连接上的键是否存在多次,而不是在更新列中存储多个值,但不确定实现此目的的有效方法:

SELECT 
  MainTable.Name 
FROM MainTable 
INNER JOIN ASSN_Main ON MainTable.AppID = ASSN_Main.AppID 
WHERE 
  EXISTS (SELECT 
            COUNT(MainTable.AppID) 
          FROM MainTable 
          INNER JOIN ASSN_Main ON MainTable.AppID = ASSN_Main.AppID 
          GROUP BY 
            MainTable.AppID 
          HAVING 
            (COUNT(MainTable.AppID)>1));

问题是子查询抓取了在appid上有重复的正确的子查询,但主SELECT查询获取所有appid名称而不是仅存在于子查询中的名称。由于子查询是正确的,不确定是什么问题?

4 个答案:

答案 0 :(得分:1)

我不知道访问SQL,但是这样的东西在SQL Server中可以工作:

SELECT  
   MainTable.Name  
FROM 
   MainTable  INNER JOIN ASSN_Main ON MainTable.AppID = ASSN_Main.AppID  
WHERE  
   MainTable.AppID IN 
      (SELECT  
          MainTable.AppID  
       FROM MainTable  INNER JOIN ASSN_Main ON MainTable.AppID = ASSN_Main.AppID  
       GROUP BY  
          MainTable.AppID  
       HAVING  
          (COUNT(MainTable.AppID)>1)); 

所以基本上用IN替换EXISTS并从子查询中返回AppID。

答案 1 :(得分:1)

主查询中的项与子查询中的项之间没有关系,因此查询返回的是“所有项目,如果有任何项目具有重复项”。你想要的是“所有有重复的项目”:

SELECT 
  MainTable.Name 
FROM MainTable m
INNER JOIN ASSN_Main a ON m.AppID = a.AppID 
WHERE 
  EXISTS (SELECT AppID
          FROM ASSN_Main
          WHERE AppID = m.AppID
          GROUP BY AppID 
          HAVING COUNT(*)>1);

答案 2 :(得分:0)

我不确定你要做什么,但是为了调试一般的Access查询,我会将其分解为多个查询,这样你就可以看到每一步发生了什么。然后,如果您愿意,可以将它们组合成一个执行所有步骤的查询。

答案 3 :(得分:0)

尝试将INNER JOIN更改为WHERE子句。当您将其更改为WHERE时,子查询中的ASSN_Main将引用父查询中的表。

这里有一个很好的EXISTS条款概述: http://www.techonthenet.com/sql/exists.php