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);