使用SQL查询将返回的记录限制为唯一

使用SQL查询将返回的记录限制为唯一,sql,ms-access,Sql,Ms Access,我正在使用Microsoft Access设计一个查询(我最终将提取该查询并在我的MFC应用程序中使用。到目前为止,我有: SQL视图是: SELECT [Congregation Speaker Talks].talkno, [Congregation Speaker Talks].congregation FROM [Congregation Speaker Talks] WHERE ((([Congregation Speaker Talks].congregation)<>

我正在使用Microsoft Access设计一个查询(我最终将提取该查询并在我的MFC应用程序中使用。到目前为止,我有:

SQL视图是:

SELECT [Congregation Speaker Talks].talkno, [Congregation Speaker Talks].congregation
FROM [Congregation Speaker Talks]
WHERE ((([Congregation Speaker Talks].congregation)<>'Keynsham'))
ORDER BY [Congregation Speaker Talks].talkno;
此查询返回集合设置为Keynsham的所有集合演讲者通话号码列表

步骤2 接下来,我在我的Public Talk Titles表上创建了一个新的查询。该表中每个谈话编号只包含一次。我使用
KeynshamTalks
查询的结果作为子查询:

SELECT *
FROM [Public Talk Titles]
WHERE ((([Public Talk Titles].[Talk Number]) Not In (SELECT [Talk Number]
FROM
[KeynshamTalks]
)))
ORDER BY [Public Talk Titles].[Talk Number];
这是可行的。结果正是我想要看到的。但是我如何将第一个查询直接移动到第二个查询中,使其成为一个查询?

这就是我想要的:

SELECT *
FROM [Public Talk Titles]
WHERE ((([Public Talk Titles].[Talk Number]) Not In (
SELECT [Public Talk Titles].[Talk Number]
FROM [Public Talk Titles] INNER JOIN [Congregation Speaker Talks] ON [Public Talk Titles].[Talk Number] = [Congregation Speaker Talks].talkno
WHERE ((([Congregation Speaker Talks].congregation)="Keynsham"))
)))
ORDER BY [Public Talk Titles].[Talk Number];

您应该使用
不存在
而不是
不在
中编写查询:

SELECT ptt.*
FROM [Public Talk Titles] as ptt
WHERE NOT EXISTS (SELECT 1
                  FROM [Congregation Speaker Talks] as cst
                  WHERE ptt.[Talk Number] = cst.talkno AND
                        cst.congregation = "Keynsham"
                 )
ORDER BY ptt.[Talk Number];
请注意,表别名(以及去掉不必要的括号)如何使查询更易于编写和读取


如果您只需要对话的一个子集,那么在外部查询中添加一个
WHERE
子句。

请阅读并接受答案为什么需要会众名称?@serakfalcon我不需要它可见。它只是为了开发。我只需要一个唯一的对话编号列表,其中会众不是Keynsham。然后使用distinct和remove会众名称。正是会众名称导致数字以distinct重复。@serakfalcon如果我删除会众名称,则我无法将记录筛选到没有Keynsham的记录。现在唯一需要考虑的是进一步限制列表,以便显示的最大通话号码为194或者更低。谢谢你的想法。我可以看到它更容易查看,并且我确认它在Access中工作。在我自己的应用程序中,然后失败。但是我的其他查询工作。因此我将坚持使用它。但是仍然感谢你。@AndrewTruckle…这个版本也应该更高效,特别是有了正确的索引。出于某种原因当我使用你的时,我自己的应用程序没有显示要使用的字段名。只有*和1。当我使用我的查询时,我会列出“Talk Number”。我将继续使用我的,但我会投票给你的。
SELECT ptt.*
FROM [Public Talk Titles] as ptt
WHERE NOT EXISTS (SELECT 1
                  FROM [Congregation Speaker Talks] as cst
                  WHERE ptt.[Talk Number] = cst.talkno AND
                        cst.congregation = "Keynsham"
                 )
ORDER BY ptt.[Talk Number];