更新a表中c字段等于b表的c字段,条件是当a表中d字段等于或包含b表d字段的值。 求sql更新语句。 10
更新SaleBillVouch表的cdefine14字段等于DispatchList表的cdefine14,当SaleBillVouch表等于或者包含DispatchLi...
更新SaleBillVouch表的cdefine14字段等于DispatchList表的cdefine14,当SaleBillVouch表等于或者包含DispatchList表的cDLCode 值时。
SaleBillVouch
cDLCode cdefine14
10007209,10007780,10008116
11000894,11000895
11000825,11000860
DispatchList
cDLCode cdefine14
10007780 商业
11000894 商业
11000861 商业
结果
SaleBillVouch
cDLCode cdefine14
10007209,10007780,10008116 商业
11000894,11000895 商业
请问该如何写sql语句。
SA表 code cdefine
01,02,03,04
06,07
09
DIS表 code cdefine
01 14
02 14
03 14
04 14
06 17
07 17
09 19
结果:SA表
code cdefine
01,02,03,04 14
06,07 17
09 19
更新sa表的cdefine(为空时)等于dis表的cdefine,条件是sa表的code等于或者包含dis表的code时。 展开
SaleBillVouch
cDLCode cdefine14
10007209,10007780,10008116
11000894,11000895
11000825,11000860
DispatchList
cDLCode cdefine14
10007780 商业
11000894 商业
11000861 商业
结果
SaleBillVouch
cDLCode cdefine14
10007209,10007780,10008116 商业
11000894,11000895 商业
请问该如何写sql语句。
SA表 code cdefine
01,02,03,04
06,07
09
DIS表 code cdefine
01 14
02 14
03 14
04 14
06 17
07 17
09 19
结果:SA表
code cdefine
01,02,03,04 14
06,07 17
09 19
更新sa表的cdefine(为空时)等于dis表的cdefine,条件是sa表的code等于或者包含dis表的code时。 展开
3个回答
展开全部
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 作为更新的条件。
--字符中没有逗号的情况 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表关联,其他的后续我想你应该能做的了,这个问题最大难点就是将一个字段的值拆分
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,难道也执行?
update a set a.cdefine14= b.cdefine14 from salebillvouch a, dispatchlikst b where a.cDLCode =b.cDLCode
简单点,不一致的不给执行。不然怕对应不起来。比如A表的CDLCODE是222,B表的CDLCODE是22,难道也执行?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询