我试图将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代码相关的所有记录"。但是,它也会复制它们(尽管打开了唯一的记录)并且不可更新。
长话短说,如何选择具有给定条件的重复项(capcode = 1的重复ID代码)并返回包含这些ID代码的所有记录,而不仅仅是capcode = 1的记录?虽然仍然可以更新我的查询?
看起来这样做的方法是删除子查询并将select函数放入主函数中,但我不确定如何做到这一点并将capcode标准折叠到其中。
非常感谢你的帮助!
PS。我还是只学习SQL,所以答案和代码的小解释真的很有用,否则我只是复制并粘贴,尽量不要破解。
答案 0 :(得分:0)
所以,我最终搞清楚如何做到这一点。我发布在这里,以便其他人可以尝试我奇怪的hodge podge(风险自负),或者更有经验的人可以提高我对如何做到这一点的最佳猜测。
我最后单独写了两个查询。第一个做我原来的第一个,拉出所有问题ID。第二个提取与这些相关的所有记录。第二个也直接从三个相关表中提取信息,而不是从查询中提取所有内容,我之前不知道该怎么做。
无论如何,我将Query 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")))));