我正在两个表之间进行内部连接,其中一个是关联表,因此存在多对一关系。我试图提出一个查询,可以决定连接上的键是否存在多次,而不是在更新列中存储多个值,但不确定实现此目的的有效方法:
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名称而不是仅存在于子查询中的名称。由于子查询是正确的,不确定是什么问题?
答案 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