gpt4 book ai didi

database - 有效检查可能的重复实体

转载 作者:搜寻专家 更新时间:2023-10-30 21:55:10 27 4
gpt4 key购买 nike

我需要在用户将实体保存到数据库之前生成可能重复项的列表,并警告他们注意可能的重复项。

我们应该根据 7 个标准检查重复项,如果至少有 3 个匹配,我们应该将其标记给用户。标准将全部匹配 ID,因此不需要模糊字符串匹配,但我的问题来自这样一个事实,即至少有 3 个项目可以匹配7 种可能的列表。

我不想执行 99 个单独的数据库查询来查找我的搜索结果,我也不想从客户端的数据库和过滤器中取回全部内容。我们目前可能只谈论几万条记录,但随着系统的成熟,这将增长到数百万条。

有没有人想到一个非常有效的方法来做到这一点?我正在考虑一个简单的 OR 查询来获取至少有一个字段与数据库匹配的记录,然后在客户端上进行一些处理以进一步过滤它,但是一些字段的基数非常低并且实际上不会减少数量巨大。

谢谢乔恩

最佳答案

ORCASE 求和可以工作,但效率很低,因为它们不使用索引。

您需要为索引创建 UNION 才能使用。

如果用户在数据库中输入namephoneemailaddress,而你想检查与这些字段中至少 3 匹配的所有记录,您发出:

SELECT  i.*
FROM (
SELECT id, COUNT(*)
FROM (
SELECT id
FROM t_info t
WHERE name = 'Eve Chianese'
UNION ALL
SELECT id
FROM t_info t
WHERE phone = '+15558000042'
UNION ALL
SELECT id
FROM t_info t
WHERE email = '42@example.com'
UNION ALL
SELECT id
FROM t_info t
WHERE address = '42 North Lane'
) q
GROUP BY
id
HAVING COUNT(*) >= 3
) dq
JOIN t_info i
ON i.id = dq.id

这将在这些字段上使用索引并且查询会很快。

详见我博客中的这篇文章:

  • Matching 3 of 4 : 如何匹配至少匹配 4 个可能条件中的 3
  • 的记录

另见 question文章基于。

如果你想在现有数据中有一个 DISTINCT 值的列表,你只需将这个查询包装到一个子查询中:

SELECT  i.*
FROM t_info i1
WHERE EXISTS
(
SELECT 1
FROM (
SELECT id
FROM t_info t
WHERE name = i1.name
UNION ALL
SELECT id
FROM t_info t
WHERE phone = i1.phone
UNION ALL
SELECT id
FROM t_info t
WHERE email = i1.email
UNION ALL
SELECT id
FROM t_info t
WHERE address = i1.address
) q
GROUP BY
id
HAVING COUNT(*) >= 3
)

请注意,此 DISTINCT 不可传递:如果 A 匹配 B 并且 B 匹配 C ,这并不意味着 A 匹配 C

关于database - 有效检查可能的重复实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/825664/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com