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

Posted

技术标签:

【中文标题】当与第二个字段相关时,在一个字段中查找完整匹配项【英文标题】:Find full matches in one field when related to a second field 【发布时间】:2020-01-18 23:07:32 【问题描述】:

如果我希望通过以下两个表格合理地总结一个问题,我将不胜感激:

Table1 包含主要原始数据,其中 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 的唯一值,然后查询应返回 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”,则查询不会返回任何内容,因为相应的 FieldB 项目也存在于其他地方。

我确实在 Excel 中使用 VBA 解决了这个问题(构建一个命中表并查看是否满足用户输入值的相应总计数),但尽管我在使用 Access SQL (2007) 方面确实有一些经验,但我'正在努力将这个想法从 VBA 转换。我将不胜感激。

【问题讨论】:

当然a, b, d 的计数也满足rabbitferret,因为在这两种情况下都有1? 抱歉,太晚了——是的,兔子和雪貂的条件都满足了。文字已更新。 a,c 同样应该返回rabbit 【参考方案1】:

此查询应为您提供所需的结果。它使用子查询生成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

【讨论】:

非常感谢 - 以及指向 dbfiddle 的指针......这非常有用。虽然一切都在那里完美运行,但 Access SQL (2007) 的 JOIN 行存在问题(“FROM 子句中的错误” - 查询运行时删除了行)。 @Jim 我认为 Access 可能要求它明确为 INNER JOIN - 请参阅我的编辑 INNER JOIN 完美运行(有时访问有点愚蠢) - 干杯!我现在需要仔细查看这两个出色的答案,一次阻止,并找出它们是如何工作的。很高兴有两种不同的方法。很遗憾我不能“接受”这两个答案。 @Jim 是的 - 访问本身就是一项法律。我很高兴解决了这个问题。正如你所说,很遗憾你不能接受两个答案,你所能做的就是对两者都投赞成票(我想你已经这样做了)。【参考方案2】:

除非我误解了逻辑,否则我建议如下:

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 组中(在本例中为 abd)而不出现其他组。

查询仅引用table1,因为没有使用聚合或计数。

select 1 的使用纯粹是一种优化,因为我们不关心相关子查询返回什么,而只关心是否存在一条或多条记录 - 因此,它可以返回最少的必要信息量验证这一点。

【讨论】:

非常感谢这个出色的答案 - 一切都很好。我现在需要慢慢查看这两个答案并找出它们是如何工作的(很好,它们不同)。我希望我能“接受”这两个答案——愚蠢的是你不能。 谢谢@Jim。 FWIW,我已经更新了我上面的答案,以提供更多关于查询如何运作的解释。

以上是关于当与第二个字段相关时,在一个字段中查找完整匹配项的主要内容,如果未能解决你的问题,请参考以下文章

我需要比较python中的2个嵌套列表以查找第一个列表的字符串与第二个列表中的字符串不匹配的位置

是否有一个 Excel 函数或脚本来查找和替换两个不同工作表中匹配的字段,并将其替换为第二个工作表中包含的另一个数据?

将第一个文件的第一列与第二个文件中的行匹配,然后将第二个文件中匹配行的最后一列插入第一个文件中的新第一列

awk 查找两个文件中第二个字段之间的差异

Ms Access 比较两个记录集

如果一个列值与第二个 df 列值匹配,我有两个数据框过滤 onmatch 列行