2015-07-10 59 views
0

我需要比较一个表中的两行来更新lineB中的字段,这些字段在lineA中填写。我的问题是,我需要比较的两个字段只是部分匹配。所以我不能只通过LIKE比较来执行更新语句。环游标匹配字段

我需要比较的字段包含生成的文件名。 这个名字在表格中一次存在两次,没有这个字母,就没有“Bestand-”一词。 为了使用来自lineA的信息更新lineB,我需要匹配这两个名字。

该表的示意图如下所示。

Id DateinameMarbilder  PfadNeu  
    1 Bestand-one    night  
    2 Bestand-two    evening  
    3 Bestand-three    morning   
    4 Bestand-four    noon 
    5 one      NULL 
    6 two      NULL 
    7 three      NULL 
    8 four      NULL 

这些只是我需要阅读的两个字段,表格要大得多。

我试图通过使用游标和循环来实现。 我得到一个语法错误的第四行至极我似乎无法解决。这似乎是一个声明值的问题。 除此之外,我不太清楚如何使第二个游标循环遍历所有行以找到匹配字段,然后执行更新。不幸的是,表格没有组织,所以我不能只比较下一行和之前的行。

这里是查询我想:

CREATE PROCEDURE curing() 

BEGIN 
DECLARE tester INT DEFAULT FALSE; 
DECLARE name CHAR(50); 
DECLARE tempColName CHAR(50); 
DECLARE tempCol CHAR(30); 

DECLARE schreiber_cursor1 CURSOR FOR 
SELECT DateinameMarbilder FROM marbilder; 
DECLARE schreiber_cursor2 CURSOR FOR 
SELECT DateinameMarbilder FROM marbilder; 

DECLARE update_cursor CURSOR FOR 
SELECT PfadNeu FROM marbilder; 


DECLARE CONTINUE HANDLER 
FOR NOT FOUND SET tester = TRUE; 


OPEN schreiber_cursor1; 
OPEN schreiber_cursor2; 
OPEN update_cursor; 

get_name: LOOP 
FETCH schreiber_cursor1 INTO name; 
FETCH schreiber_cursor2 INTO TempColName; 
FETCH update_cursor INTO tempcol; 
IF tester THEN 
    LEAVE get_name; 

IF name LIKE %TempColName THEN 
UPDATE marbilder SET 'PfadNeu'=update_cursor ; 

ELSE FETCH [[NEXT] FROM] schreiber_cursor2 INTO TempColName; 

CLOSE schreiber_cursor; 
CLOSE update_cursor; 

END; 

回答

0

如果我理解正确的是你所需要的就是这一点。但请务必在执行此操作之前拍下此表的副本

Update marbilder as t1 inner join marbilder as t2 on 
t1.DateinameMarbilder like concat(',%',t2.DateinameMarbilder)  
set 
t2.PfadNeu=t1.PfadNeu 
where t1.DateinameMarbilder like '%-%' and t2.PfadNeu is null 
+0

它似乎工作得很好。谢谢! 只是%之前的逗号是一个错字。 – Jeanne2130