使用双循环通过pl sql更新表过程

时间:2015-07-29 15:42:54

标签: sql oracle stored-procedures plsql

假设我只有一张桌子: members_tbl列是:SN,FN,DB,IDDBL,FLAG,DBLCRIT我需要更新表,如果这个算法有一些条件是正常的:

R.drawables.main_title

这是一个测试用例:

   id_dup := 1;
FOR (i in 1 to Nrow(members_tbl)) THEN
{
FOR (j in (i+1) to Nrow(members_tbl)) THEN
{
IF(members_tbl(i).iddbl IS NULL) THEN
members_tbl(i).iddbl := id_dup
IF (((members_tbl(i).DBIRTH ==members_tbl(j).DBIRTH) AND
    (UTL_MATCH.jaro_winkler_similarity(members_tbl(i).SNAME,members_tbl(j).SNAME) > 80) AND
  (UTL_MATCH.jaro_winkler_similarity(members_tbl(i).FNAME,members_tbl(j).FNAME) > 80)) 
AND (members_tbl(j).iddbl IS NULL)) THEN
{
   members_tbl(j).iddbl := id_dup;
   members_tbl(i).flag := 1;
   members_tbl(j).flag := 1;
   members_tbl(i).dblcrit:= 1;
   members_tbl(j).dblcrit:= 1;
}

}
   id_dup := id_dup + 1;
}

更加全面,我确实改变了SNAME中的列SN,FNAME中的FN和DBIRTH中的DB

有没有办法在pl / sql程序中编写这个算法? 我是PL / SQL的新手,我从来没有写过存储过程。

2 个答案:

答案 0 :(得分:0)

我认为这会奏效。您需要弄清楚它是如何确定哪一行是"更高"因此重复。

update members_tbl
set iddbl = 1
where iddbl is null and exists (
    select 1
    from members_tbl m2
    where
            m2.DB = members_tbl.DB
        and UTL_MATCH.jaro_winkler_similarity(members_tbl.FN, m2.FN) > 80
        and UTL_MATCH.jaro_winkler_similarity(members_tbl.SN, m2.SN) > 80
        and NumberOfRow(m2) < NumberOfRow(members_tbl) /* ??? */

);

update members_tbl
set flag = 1, dblcrit = 1;

答案 1 :(得分:0)

实际上,正如@ shawnt00所建议的那样,它是基于Jaro Winkler函数的字符串近似的重复检测。因此,不需要count(不需要flag,dblcrit,iddbl),只需要一个左外连接:

SELECT * FROM (
SELECT m.IDM,
       m2.IDM AS dups_key
FROM members_tbl m
LEFT OUTER JOIN members_tbl m2
ON ( m.IDM != m2.IDM
      AND m.DBIRTH = m2.DBIRTH
      AND utl_match.jaro_winkler_similarity(m.SNAME,m2.SNAME) > 80
      AND utl_match.jaro_winkler_similarity(m.FNAME,m2.FNAME) > 80 )
    )
Where dups_key IS NOT NULL;

从那以后,如果我使用过前面提到的计数器,我已经提取了我需要的其他信息;所以在以下链接中,以下是从上面第一个查询中提取的其他数据:this link.