当与第二个字段相关时,在一个字段中查找完全匹配项

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 总数。

例如

我确实使用 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

Demo on dbfiddle