当与第二个字段相关时,在一个字段中查找完全匹配项
Find full matches in one field when related to a second field
对于我希望用下面两个 table 合理总结的问题提供的帮助,我将不胜感激:
表 1 包含主要原始数据,其中 FieldA 与 FieldB 中的特定项目有关系。
FieldB 中的项目相对于 FieldA 中的每个唯一项目都是唯一的 - 也就是说,猫、狗、兔子、鸡只会在 FieldA 的 "a" 组下出现一次(它们可以出现在其他地方在该领域)。同样对于 FieldA 中的 b、c 和 d 项目(所有 FieldB 项目仅针对每个项目出现一次)。
Table2 列出了 Table1 FieldB 中每个唯一项的总数,由以下查询生成:
qryCount:
select FieldB, count(FieldB) AS FCount
from Table1
GROUP BY FieldB;
我的问题:
用户在 Table1 中输入 FieldA 的唯一值,然后查询应该 return FieldB(Table1)中的所有唯一值,其中实现了完全匹配,相对于 Table2 中的相应 FCount 总数。
例如
- 如果用户输入 "a,b,d",查询输出 "cat, dog, rabbit, ferret",因为满足 cat(3)、dog(2)、rabbit(1) 和 ferret(1) 的总数。
- 如果用户输入 "a,c",查询输出 "chicken,rabbit",因为 chicken(2) 和 rabbit(1) 的总计数已满足。
- 如果用户输入 "b",则查询 return 没有任何内容,因为相应的 FielDB 项目也存在于其他地方。
我确实使用 Excel 中的 VBA 解决了这个问题(建立点击 table 并查看是否满足用户输入值的相应总计数),但是虽然我确实有一些使用 Access SQL (2007) 的经验,我正在努力将这个想法从 VBA 转换过来。如果能提供一些帮助,我将不胜感激。
除非我误解了逻辑,否则我会提出以下建议:
select distinct t1.fieldb from table1 t1
where
t1.fielda in ('a', 'b', 'd') and
not exists
(
select 1 from table1 t2
where t2.fieldb = t1.fieldb and t2.fielda not in ('a', 'b', 'd')
)
关于上面的几点说明:
查询本质上是选择 FieldB
持有的值仅出现在目标 FieldA
组中的记录(在本例中为 a
,b
,d
) 并且没有其他组。
查询仅引用 table1
,因为未使用聚合或计数。
select 1
的使用纯粹是一种优化,因为我们不关心相关子查询 return 是什么,而只关心一个或多个记录存在 - 如这样,它可以 return 验证这一点所需的最少信息量。
此查询应该会为您提供所需的结果。它使用子查询生成 Table2
的有效副本,但仅针对 FieldA
的所需值。然后将其连接到 Table2
,仅给出 FCount
的值匹配的行:
SELECT t1.FieldB
FROM (SELECT FieldB, COUNT(FieldB) AS FCount
FROM Table1
WHERE FieldA IN ('a', 'b', 'd')
GROUP BY FieldB) t1
INNER JOIN Table2 t2 ON t2.FieldB = t1.FieldB AND t2.FCount = t1.FCount
输出:
FieldB
cat
dog
ferret
rabbit
对于我希望用下面两个 table 合理总结的问题提供的帮助,我将不胜感激:
表 1 包含主要原始数据,其中 FieldA 与 FieldB 中的特定项目有关系。
FieldB 中的项目相对于 FieldA 中的每个唯一项目都是唯一的 - 也就是说,猫、狗、兔子、鸡只会在 FieldA 的 "a" 组下出现一次(它们可以出现在其他地方在该领域)。同样对于 FieldA 中的 b、c 和 d 项目(所有 FieldB 项目仅针对每个项目出现一次)。
Table2 列出了 Table1 FieldB 中每个唯一项的总数,由以下查询生成:
qryCount:
select FieldB, count(FieldB) AS FCount
from Table1
GROUP BY FieldB;
我的问题: 用户在 Table1 中输入 FieldA 的唯一值,然后查询应该 return FieldB(Table1)中的所有唯一值,其中实现了完全匹配,相对于 Table2 中的相应 FCount 总数。
例如
- 如果用户输入 "a,b,d",查询输出 "cat, dog, rabbit, ferret",因为满足 cat(3)、dog(2)、rabbit(1) 和 ferret(1) 的总数。
- 如果用户输入 "a,c",查询输出 "chicken,rabbit",因为 chicken(2) 和 rabbit(1) 的总计数已满足。
- 如果用户输入 "b",则查询 return 没有任何内容,因为相应的 FielDB 项目也存在于其他地方。
我确实使用 Excel 中的 VBA 解决了这个问题(建立点击 table 并查看是否满足用户输入值的相应总计数),但是虽然我确实有一些使用 Access SQL (2007) 的经验,我正在努力将这个想法从 VBA 转换过来。如果能提供一些帮助,我将不胜感激。
除非我误解了逻辑,否则我会提出以下建议:
select distinct t1.fieldb from table1 t1
where
t1.fielda in ('a', 'b', 'd') and
not exists
(
select 1 from table1 t2
where t2.fieldb = t1.fieldb and t2.fielda not in ('a', 'b', 'd')
)
关于上面的几点说明:
查询本质上是选择
FieldB
持有的值仅出现在目标FieldA
组中的记录(在本例中为a
,b
,d
) 并且没有其他组。查询仅引用
table1
,因为未使用聚合或计数。select 1
的使用纯粹是一种优化,因为我们不关心相关子查询 return 是什么,而只关心一个或多个记录存在 - 如这样,它可以 return 验证这一点所需的最少信息量。
此查询应该会为您提供所需的结果。它使用子查询生成 Table2
的有效副本,但仅针对 FieldA
的所需值。然后将其连接到 Table2
,仅给出 FCount
的值匹配的行:
SELECT t1.FieldB
FROM (SELECT FieldB, COUNT(FieldB) AS FCount
FROM Table1
WHERE FieldA IN ('a', 'b', 'd')
GROUP BY FieldB) t1
INNER JOIN Table2 t2 ON t2.FieldB = t1.FieldB AND t2.FCount = t1.FCount
输出:
FieldB
cat
dog
ferret
rabbit