Sql 加入以与可能交换的数据执行比较匹配

Sql 加入以与可能交换的数据执行比较匹配,sql,snowflake-cloud-data-platform,snowsql,Sql,Snowflake Cloud Data Platform,Snowsql,我试图在snowflake中对目标表(700K行)和源表(150万行)中的名字、中间名字和姓氏进行比较匹配。first\u name、middle\u name和last\u name中的值可以在source表中部分交换或完全交换,也就是说first\u name中的值可以与last\u name中的值交换或以任何其他方式交换。对于肯定的可能识别,至少需要两个匹配项是正确的。然后我做进一步的处理以保证比赛的准确性 示例: 案例1:名字(目标)=名字(来源)|中间名(目标)=中间名。(比赛) 案例

我试图在
snowflake
中对目标表(700K行)和源表(150万行)中的
名字、中间名字和姓氏进行比较匹配。
first\u name
middle\u name
last\u name
中的值可以在
source
表中部分交换或完全交换,也就是说
first\u name
中的值可以与
last\u name
中的值交换或以任何其他方式交换。对于肯定的可能识别,至少需要两个匹配项是正确的。然后我做进一步的处理以保证比赛的准确性

示例:

案例1:名字(目标)=名字(来源)|中间名(目标)=中间名。(比赛)

案例2:名字(目标)=姓氏(源)|中间名(目标)=中间名(源)|姓氏(目标)=名字(源)->与lame交换的名字(匹配)

示例(带表格)

Target Table
id   | first_na_t    |   middle_name_t   |     last_name_t
1    |   ffa         |       mma         |         lla    
2    |   ffa         |       mmb         |         lla
3    |   ffb         |       ffa         |         llb
4    |   ffc         |       mmd         |         lla
...

Source Table
id      | first_name_s  |   middle_name_s |     last_name_s
1       |   lla         |       mmb         |         ffa    
5       |   ffa         |       mmb         |         lla
3       |   ffb         |       ffa         |         llb
4       |   mmd         |       ffc         |         lla
...
从示例表中,我尝试将
目标
表中的第一行与
表中的所有其他行进行比较,之后使用
交叉连接
案例
,但这被证明是低效且缓慢的


有没有办法巧妙地将
连接到
中,将
目标
表中的行与
表中的行进行比较,得出至少2个匹配项,即使任何
名称
列都可以交换。另外,我不能使用
id
列。

您可以这样表达逻辑:

from TARGET_TABLE T join
     SOURCE_TABLE S
     on ((case when s.FIRST_NAME_s in (t.FIRST_NAME_T, t.MIDDLE_NAME_T, t.LAST_NAME_T then 1 else 0 end) +
         (case when s.MIDDLE_NAME_s in (t.FIRST_NAME_T, t.MIDDLE_NAME_T, t.LAST_NAME_T then 1 else 0 end) +
         (case when s.LAST_NAME_s in (t.FIRST_NAME_T, t.MIDDLE_NAME_T, t.LAST_NAME_T then 1 else 0 end)
        ) >= 2
然而,这可能需要很长时间才能实现

相反,让我们将名称分成单独的行并聚合:

select t.id, s.id
from (target_table t cross join lateral
      (values (t.first_name_t), (t.middle_name_t), (t.last_name_t)
      ) vt(name)
     ) join
     (source_table t cross join lateral
      (values (s.first_name_s), (s.middle_name_s), (s.last_name_s)
      ) vs(name)
     )
     on vt.name = vs.name
group by t.id, s.id
having count(*) >= 2;

注意:如果一个名称中的不同名称组件相同,这可能会有点混乱,但是如果需要,您可以调整逻辑来处理它。

是为
postgress
编写的第二个查询,因为我在尝试运行fit in
snowflake
时不断出错?@Lukasz。也许雪花需要逗号而不是交叉连接。