Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用双循环通过pl sql更新表过程_Sql_Oracle_Stored Procedures_Plsql - Fatal编程技术网

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

使用双循环通过pl sql更新表过程,sql,oracle,stored-procedures,plsql,Sql,Oracle,Stored Procedures,Plsql,假设我只有一个表: 成员\u tbl哪些列是:SN、FN、DB、IDDBL、FLAG、DBLCRIT如果此算法的某些条件合适,我需要更新表: 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 (((me

假设我只有一个表: 成员\u tbl哪些列是:SN、FN、DB、IDDBL、FLAG、DBLCRIT如果此算法的某些条件合适,我需要更新表:

   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;
}
下面是一个测试用例:

CREATE TABLE MEMBERS_TBL
  (
    IDM     NUMBER(9) NOT NULL ,
    SNAME   VARCHAR2(20) ,
    FNAME   VARCHAR2(20) ,
    DBIRTH  VARCHAR2(15) ,
    IDDBL   NUMBER(10) ,
    FLAG    SMALLINT ,
    DBLCRIT SMALLINT
  );
Insert into members_tbl (IDM,SNAME,FNAME,DBIRTH,IDDBL,FLAG,DBLCRIT) values (125,'BOLOREY','JEANNE','11/05/1955',NULL,NULL,NULL);
Insert into members_tbl (IDM,SNAME,FNAME,DBIRTH,IDDBL,FLAG,DBLCRIT) values (126,'BOLLOREY','JEANNE','11/05/1955',NULL,NULL,NULL);
Insert into members_tbl (IDM,SNAME,FNAME,DBIRTH,IDDBL,FLAG,DBLCRIT) values (153,'BALORE','GIANNE','11/05/1955',NULL,NULL,NULL);
Insert into members_tbl (IDM,SNAME,FNAME,DBIRTH,IDDBL,FLAG,DBLCRIT) values (223,'ABOLLOREYY','JEANNE','11/05/1955',NULL,NULL,NULL);
Insert into members_tbl (IDM,SNAME,FNAME,DBIRTH,IDDBL,FLAG,DBLCRIT) values (225,'FIABLE','MARINE','25/04/1963',NULL,NULL,NULL);
Insert into members_tbl (IDM,SNAME,FNAME,DBIRTH,IDDBL,FLAG,DBLCRIT) values (228,'FAIBLE','MARYANE','25/04/1963',NULL,NULL,NULL);
Insert into members_tbl (IDM,SNAME,FNAME,DBIRTH,IDDBL,FLAG,DBLCRIT) values (230,'FAIBLE','MARINE','25/04/1963',NULL,NULL,NULL);
Insert into members_tbl (IDM,SNAME,FNAME,DBIRTH,IDDBL,FLAG,DBLCRIT) values (235,'LIPARK','JACQLINE','20/12/1939',NULL,NULL,NULL);
Insert into members_tbl (IDM,SNAME,FNAME,DBIRTH,IDDBL,FLAG,DBLCRIT) values (236,'ILIPARC','JACQUELYNE','20/12/1939',NULL,NULL,NULL);
Insert into members_tbl (IDM,SNAME,FNAME,DBIRTH,IDDBL,FLAG,DBLCRIT) values (237,'LIPARC','JACQUELHINE','20/12/1939',NULL,NULL,NULL);
Insert into members_tbl (IDM,SNAME,FNAME,DBIRTH,IDDBL,FLAG,DBLCRIT) values (240,'RINTET','MALIKA','07/08/1954',NULL,NULL,NULL);
Insert into members_tbl (IDM,SNAME,FNAME,DBIRTH,IDDBL,FLAG,DBLCRIT) values (241,'GRISION','RAUGER','26/10/1931',NULL,NULL,NULL);
Insert into members_tbl (IDM,SNAME,FNAME,DBIRTH,IDDBL,FLAG,DBLCRIT) values (242,'GRISION','ROGER','26/10/1931',NULL,NULL,NULL);
Insert into members_tbl (IDM,SNAME,FNAME,DBIRTH,IDDBL,FLAG,DBLCRIT) values (245,'GRESION','RAUJER','26/10/1931',NULL,NULL,NULL);
为了更全面,我确实更改了SNAME中的SN列、FNAME中的FN列和DBIRTH中的DB列

有没有办法在pl/sql过程中编写此算法?
我对PL/SQL比较陌生,而且从未编写过存储过程。

我认为这会奏效。您需要弄清楚它如何确定哪一行更高,从而确定重复的行

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;

我想这会管用的。您需要弄清楚它如何确定哪一行更高,从而确定重复的行

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;

实际上,正如@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;

从中,我提取了我需要的其他信息,如果我使用前面提到的计数器;因此,在下面的链接中,这里是从上面的第一个查询中提取的其他数据:

正如@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;

从中,我提取了我需要的其他信息,如果我使用前面提到的计数器;因此,在下面的链接中,这里是从上面的第一个查询中提取的其他数据:

我怀疑您是否需要循环。NumberOfrow如何确定行数?我在另一种语言(如R)上尝试过这种算法,但在大数据上,我想利用服务器性能直接在其上运行。欢迎任何建议。我怀疑你是否需要这些环。NumberOfrow如何确定行数?我在另一种语言(如R)上尝试过这种算法,但在大数据上,我想利用服务器性能直接在其上运行。欢迎任何建议。这不起作用,因为我必须使用jaro_winkler在姓名和姓氏上的相似性来寻找潜在的重复项,所以我经常编辑我的帖子以更好地澄清它。这不只是一个改变使用jaro_winkler而不是严格平等的问题吗?谢谢回复;运行此查询时出现以下错误:Erreur SQL:00907。00000-第5行缺少右括号;如果我试图删除as语句,那么我有另一个错误。我在第12行有另一个错误:00933。00000-SQL命令未正确结束,看起来一切正常,但我不知道出了什么问题\注:那么iddbl增量呢?是的,你是对的。我认为另一个问题是分号。如果去掉循环,就不需要计数器。现在我有一个错误:00904。00000-%s:无效标识符:NUMBEROFROW I注意到存在2个逗号;即使删除第一个也不起作用。这不起作用,因为我必须使用jaro_winkler在姓名和姓氏上的相似性来寻找潜在的重复项,所以我经常编辑我的帖子以更好地澄清它。这不只是一个改用jaro_winkler而不是严格平等的问题吗?谢谢回复;运行此查询时出现以下错误:Erreur SQL:00907。00000-第5行缺少右括号;如果我试图删除as语句,那么我有另一个错误。我在第12行有另一个错误:00933。00000-SQL命令未正确结束,看起来一切正常,但我不知道出了什么问题\注:那么iddbl增量呢?是的,你是对的。我认为另一个问题是分号。如果去掉循环,就不需要计数器。现在我有一个错误:00904。00000-%s:无效标识符:NUMBEROFROW I注意到存在2个逗号;即使移除第一个,它也不起作用。