update SA set cdefine = result.cdefine from SA INNER JOIN ( select SA.code, ( select top 1 b.cdefine from DIS b where b.code in ( case --查询当前第一个逗号前得字符 when charindex(',',SA.code) <> 0 then substring(SA.code,1,charindex(',',SA.code)-1)
--字符中没有逗号的情况 when charindex(',',SA.code) = 0 then SA.code END ) ) as cdefine from SA ) result ON result.code =SA .code
楼主这条语句我想了好久,我的思路是:
1.将code 对应的 cdefine 组成一张表
2.更新的时候通过关联 思路1表 。进行关联
3。由于你的code字段是逗号隔开,那么可能会出现一种情况是Dis表中可能并未对应都是同样的值, 如 SA 表 code 有 0001 ,0002 DIS 表中 0001 对应的是 123 而 0002 对应的是321 是两种不同的值, 我目前是取 0001 的值 123 作为更新的条件。
新建一张和SA一样的表AAA表,下面的语句可以把SA表分开来
DECLARE
X NUMBER;
Y NUMBER;
V_LENGTH NUMBER;
BEGIN
SELECT COUNT(*) INTO Y FROM SA表;
X := 1;
FOR IDX IN 1 .. Y LOOP
INSERT INTO AAA表
SELECT REGEXP_SUBSTR((SELECT CODE, CDEFINE
FROM (SELECT *, ROWNUM RM FROM SA表)
WHERE RM = X),
'[^,]+',
1,
LEVEL)
FROM DUAL
CONNECT BY LEVEL <=
LENGTH((SELECT CODE, CDEFINE
FROM (SELECT *, ROWNUM RM FROM SA表)
WHERE RM = X)) -
LENGTH(REPLACE((SELECT CODE, CDEFINE
FROM (SELECT CODE, CDEFINE, ROWNUM RM
FROM SA表)
WHERE RM = X),
',',
'')) + 1;
COMMIT;
X := X + 1;
END LOOP;
END;
这样你用AAA表和DIS表关联,其他的后续我想你应该能做的了,这个问题最大难点就是将一个字段的值拆分
update a set a.c=b.c from table1 a, table2 b where a.d=b.d
update a set a.cdefine14= b.cdefine14 from salebillvouch a, dispatchlikst b where a.cDLCode =b.cDLCode
简单点,不一致的不给执行。不然怕对应不起来。比如A表的CDLCODE是222,B表的CDLCODE是22,难道也执行?