【问题标题】:sql restriction for join table with string similarity rule具有字符串相似性规则的连接表的sql限制
【发布时间】:2022-12-08 20:51:49
【问题描述】:

我的 Db 是从一些彼此相似且共享相同列名的表构建的。原因是要对来自每个资源的数据进行比较。

table_A and table_B: id, product_id, capacitor_name, ressitance

很容易通过product_id加入表并查看比较, 但我需要比较 product_id 之间的数据,如果两个表中都存在,如果不存在,我想按名称相似性进行比较,如果相似性限制了最多 3 个结果的结果。

大多数时候名称不相等,这就是我使用相似性的原因。

SELECT * FROM table_a ta 
JOIN table_b tb 
  ON 
    ta.product_id = tb.product_id 
    OR
    similarity(ta.name,tb.name) > 0.8

它工作正常。但问题是有时我得到的数据比我需要的多,我该如何限制它? (此外,按相似度排序以获得更高相似度的名称)。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    如果您想从三元组索引中获益,则需要使用运算符形式 (%),而不是函数形式。然后你会在两个“列”上排序,第一个是精确匹配,第二个是最相似的匹配,然后按顺序排列。并使用 LIMIT 来做限制。我假设您有一些 WHERE 条件将其限制为 table_a 的一行。如果不是,那么你的问题不是很好。这个限制应该适用于什么?每个什么应该仅限于 3 个?

    SELECT * FROM table_a ta 
    JOIN table_b tb 
      ON 
        ta.product_id = tb.product_id 
        OR
        ta.name % tb.name
    WHERE ta.id=$1
    ORDER BY ta.product_id = tb.product_id desc, similarity(ta.name,tb.name) desc
    LIMIT 3
    

    【讨论】:

    • 谢谢,但不幸的是,您的合理假设是错误的。我需要返回行数组,而不仅仅是一个行,所以我没有在这个查询中使用 where 并且这样我的查询由于嵌套循环而非常慢......我明白为什么它很慢但我想找到方法来实现它快点。
    • 但是后来我不知道你在问什么。您总共最多需要 3 行? (还有哪 3 行?)每行 A 最多有 3 行 B?在担心优化它之前,您应该弄清楚要运行的查询。
    • 我想要的 3 行是由 product_id 比较(如果为真)或 3 个最高相似度比较得出的。
    猜你喜欢
    • 2018-05-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 2011-03-05
    • 2015-06-03
    相关资源
    最近更新 更多