MS-Access 2007:查询与至少有一条记录符合指定条件的个人相关的所有记录
Posted
技术标签:
【中文标题】MS-Access 2007:查询与至少有一条记录符合指定条件的个人相关的所有记录【英文标题】:MS-Access 2007: Query all records associated with individuals which have at least one record meeting specified criteria 【发布时间】:2016-05-02 17:16:05 【问题描述】:我正在尝试将 35 年的数据从 Excel 导入 Access。清洁过程的一部分是确保我们用于捕获的动物的唯一 ID 实际上对于每只动物都是唯一的。
为此,我想确保每个标签只有一个与之关联的“第一次捕获”。我不能只搜索重复项,因为动物经常被抓到 2-5 次。
现在,我已经成功创建了该查询,它会提取带有多个 capcode“1”记录的 ID 代码。 (关于 id.type 的东西是因为这仅对以某种方式标记的动物很重要)
SELECT [Capture Table].id_code, [Capture Table].capcode,
[Capture Table].id_type, [Capture Table].capture_id
FROM [Capture Table]
WHERE ((([Capture Table].id_code) In (SELECT [id_code]
FROM [Capture Table] As Tmp GROUP BY [id_code],[capcode] HAVING Count(*)>1 And [capcode] = [Capture Table].[capcode]))
AND (([Capture Table].capcode) Like "1")
AND (([Capture Table].id_type) Like "NP" Or ([All Info Query].id_type)="E" Or ([Capture Table].id_type)="T"))
ORDER BY [Capture Table].id_code, [Capture Table].capcode;
现在,这给了我所有有问题的标签号。现在我想将它们与所有相关信息(包括与特定调查捕获相关的表中的调查信息)一起提取并返回具有这些 ID 代码的所有记录(所以我不只是更改第一次捕获并错过任何随后的重新捕获)。
这将返回记录(会话+标题+捕获查询只是将所有调查信息与相关捕获一起提取,这就是我解决“模糊外部连接错误”的方法,并且仍然可以获取所有日期和站点信息):
SELECT DISTINCTROW [Session+Header+Capture Query].Year, [Session+Header+Capture Query].site, [Session+Header+Capture Query].Date, [Session+Header+Capture Query].trappers,
[Session+Header+Capture Query].id_type, [Capcode 1 Repeat subQuery].id_code, [Session+Header+Capture Query].age, [Session+Header+Capture Query].sex, [Session+Header+Capture Query].repro,
[Session+Header+Capture Query].tail_mm, [Session+Header+Capture Query].capcode
FROM [Capcode 1 Repeat subQuery] LEFT JOIN [Session+Header+Capture Query] ON [Capcode 1 Repeat subQuery].id_code = [Session+Header+Capture Query].id_code;
因此,现在返回与“问题 ID 代码”相关的所有记录。但是,它也会复制它们(尽管打开了唯一记录)并且不可更新。
长话短说,我如何选择具有给定条件的重复项(重复 ID 代码,其中 capcode=1)并返回所有具有这些 ID 代码的记录,而不仅仅是那些 capcode=1 的记录?虽然我的查询仍然可以更新?
这样做的方法似乎是删除子查询并将选择功能放入主查询,但我不确定如何执行此操作并将 capcode 标准折叠到其中。
非常感谢您的帮助!
PS。我只是还在学习 SQL,所以答案中的小解释和代码真的很有帮助,否则我只是复制粘贴,尽量不要破坏。
【问题讨论】:
由于一个查询可以用作另一个查询的源,我尝试将复杂的逻辑分成多个更简单的查询。因此,在这种情况下,我会编写一个查询来识别问题 ID,然后在第二个查询中使用该结果来获取具有该 ID 的所有相关记录。 这就是我所拥有的。但是,它不可更新,这是一个问题,因为我正在提取记录,因为它们需要更改,并且有超过一千个记录,超过 300 个 ID。我不想自己过滤每个 ID 来更新它。但是,我想我想通了,但是您是对的,我的答案并不漂亮,而且看起来很复杂。我会发布它来分享。 【参考方案1】:所以,我最终想出了如何做到这一点。我将其发布在这里,以便其他人可以尝试我奇怪的大杂烩(风险自负),或者更有经验的人可以改进我对如何做到这一点的最佳猜测。
我最终分别编写了两个查询。第一个做我原来的第一个做的,提取所有问题ID。第二个提取与这些相关的所有记录。第二个也直接从三个相关表中提取信息,而不是从所有内容组合的查询中提取信息,我以前不知道该怎么做。
无论如何,我通过将查询 1 完整地放在查询 2 的 WHERE 子句中,将查询 1 和查询 2 组合成一个查询,因此查询 2 仅从查询 1 的结果中提取记录。每个“查询”都缩进更多在下面的代码中。
非常欢迎有关如何改进这一点的建议。
SELECT [Capture Table].*, [Session Table].Year, [Session Table].site, [Session Table].begin_date, [Session Table].end_date, [Header (Survey) Table].Date, [Header (Survey) Table].trappers
FROM [Session Table] INNER JOIN ([Header (Survey) Table] INNER JOIN [Capture Table] ON [Header (Survey) Table].survey_id = [Capture Table].survey_id) ON [Session Table].session_ID = [Header (Survey) Table].session_id
WHERE ((([Capture Table].id_code) In
(SELECT [Capture Table].[id_code]
FROM [Capture Table]
WHERE ((([Capture Table].id_code) In
(SELECT [id_code]
FROM [Capture Table] As Tmp GROUP BY [id_code],[capcode]
HAVING Count(*)>1 And [capcode] = [Capture Table].[capcode])) AND (([Capture Table].capcode) Like "1") AND (([Capture Table].id_type) Like "NP" Or ([Capture Table].id_type)="E" Or ([Capture Table].id_type)="T")))));
【讨论】:
您可以采用第一个查询并将其更改为“制作表”查询 - 我认为这将允许基于新表的第二个查询是可编辑的。以上是关于MS-Access 2007:查询与至少有一条记录符合指定条件的个人相关的所有记录的主要内容,如果未能解决你的问题,请参考以下文章
ms-access 2007 运行时和 lockWindowUpdate
MS-Access 2013;根据多记录形式的记录数据更改组合框选项