2015-07-10 100 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