Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择如果有多个_Sql_Ms Access - Fatal编程技术网

Sql 选择如果有多个

Sql 选择如果有多个,sql,ms-access,Sql,Ms Access,我在两个表之间进行内部联接,其中一个表是关联表,因此存在多对一关系。我正在尝试提出一个查询,该查询可以确定联接上的键是否存在不止一次,而不是在更新列中存储一个倍数的值,但不确定实现这一点的有效方法: SELECT MainTable.Name FROM MainTable INNER JOIN ASSN_Main ON MainTable.AppID = ASSN_Main.AppID WHERE EXISTS (SELECT COUNT(MainTa

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

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名称,而不仅仅是子查询中存在的名称。因为子查询是正确的,所以不确定出了什么问题?

我不确定您想做什么,但要调试Access查询,通常我会将其分为多个查询,以便您可以看到每个步骤中发生了什么。然后,如果需要,您可以将它们组合成一个查询,执行所有步骤。

我不知道access 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。

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

这里对EXISTS子句有一个很好的概述:

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


工作起来很有魅力,我尝试在中使用,但我想我的语法是错误的子查询需要以某种方式将其结果集与主查询关联起来,以便它做您想做的事情,我认为。无论如何,In查询在语义上更正确——它更能表达您想要实现的目标(IMHO)。谢谢,既然Guffa给了我我想要的确切答案,我就必须给他一个被接受的答案
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);