求Sql语句:根据一张表更新另一张表的字段的两种写法

时间:2021-05-17 15:07:40
有两张表如下:
表A:KCH05_TEST
组织   年度   月份   仓库   物品         出库数量
XTDWDM XTCZND XTHSQM KCCKDM KCWPDM       KCCKSL
I3     2005    01    00     BJ21100003   22222
I3     2005    01    00     BZ00000001   88888
I3     2005    01    01     BZ00000152   2336
I3     2005    01    01     BZ21100019   49962
I3     2005    01    01     YS21100020   38000
--------------------------------------------------------
表B:KCH6SUM05Y
组织   月份   类型   仓库   物品          操作数量
XTDWDM XTHSQM XTCZLX KCCKDM KCWPDM        KCCZSL
I3     01     C      00     BJ21100003    10984
I3     01     C      01     BZ00000152    2336
I3     01     C      01     BZ21100019    49962
I3     01     C      01     YS21100020    38000

想将表A中“出库数量”与表B中“操作数量”不同的用表B的“操作数量”替换,前提是“组织”、“月份”、“仓库”、“物品”相同的情况下。

本人的第一种方法如下:
UPDATE KCH05_TEST SET KCCKSL=B.KCCZSL FROM KCH05_TEST A JOIN KCH6SUM05Y B ON A.XTDWDM=B.XTDWDM AND A.XTHSQM=B.XTHSQM AND A.KCCKDM=B.KCCKDM AND A.KCWPDM=B.KCWPDM AND A.KCCKSL<>B.KCCZSL

上面的语句可以达到预期要求,但我想换成如下第二种方法替换却不行:

UPDATE KCH05_TEST SET KCCKSL=(SELECT B.KCCZSL FROM KCH6SUM05Y B WHERE kch05_test.XTDWDM=B.XTDWDM AND kch05_test.XTHSQM=B.XTHSQM AND kch05_test.KCCKDM=B.KCCKDM AND kch05_test.KCWPDM=B.KCWPDM)

不是小弟钻牛角尖,因为我的环境是IBM DB2,我用第一种方法在DB2 里运行不能支持,故我的问题如下:
(1)第一种方法在DB2环境下怎么写?
(2)第二种方法在MS SQLSERVER环境下怎么改?

谢谢大家!

19 个解决方案

#1


2,加个条件就是了:
UPDATE KCH05_TEST SET KCCKSL=(SELECT B.KCCZSL FROM KCH6SUM05Y B WHERE kch05_test.XTDWDM=B.XTDWDM AND kch05_test.XTHSQM=B.XTHSQM AND kch05_test.KCCKDM=B.KCCKDM AND kch05_test.KCWPDM=B.KCWPDM)
where exists(SELECT * FROM KCH6SUM05Y B WHERE kch05_test.XTDWDM=B.XTDWDM AND kch05_test.XTHSQM=B.XTHSQM AND kch05_test.KCCKDM=B.KCCKDM AND kch05_test.KCWPDM=B.KCWPDM)

#2


晕!
大哥,第二种写法还能再简化的么?

#3


表B的“组织”、“月份”、“仓库”、“物品”与A表存在相同记录的情况下才去更新A表,有那么多条件,没法再简化了。

#4


(1)第一种方法在DB2环境下怎么写?
----------------------------------------
不是吧,DB2难道不支持这么简单的语法?

(2)按风云的写法了

#5


update tb1 set field='value' from tb1 inner join tb2 on tb1.a1=tb2.a1

#6


needkey(一头雾水) :
第一种写法在DB2 里不行,提示:“未定义列限定词或表 B ”

huwei2003(凡) :
看不懂,什么意思啊?


#7


up

#8


(2)第二种方法在MS SQLSERVER环境下怎么改?
UPDATE KCH05_TEST SET KCCKSL=B.KCCZSL FROM KCH05_TEST A Inner JOIN KCH6SUM05Y B ON A.XTDWDM=B.XTDWDM AND A.XTHSQM=B.XTHSQM AND A.KCCKDM=B.KCCKDM AND A.KCWPDM=B.KCWPDM AND A.KCCKSL<>B.KCCZSL

#9


Softlee81307(孔腎):
这不就是我的第一种写法么?
我想问的是UPDATE A SET A.KCCKSL=(SELECT B.KCCZSL。。。。)这种写法以前见过的好像不用在句尾加 where exists 子句,可今天如果不加该子句则不能通过,提示:
“无法将 NULL 值插入列 'KCCKSL',表 'KCH05_TEST';该列不允许空值。UPDATE 失败。”

另外,(1)第一种方法在DB2环境下怎么写?若有人知道小弟另开贴送50分
(注:CSDN DB2那版没人气,不想在那问)

#10


UPDATE KCH05_TEST SET KCCKSL=B.KCCZSL FROM KCH05_TEST A Inner JOIN  ----這裡加inner 就行了
KCH6SUM05Y B ON A.XTDWDM=B.XTDWDM AND A.XTHSQM=B.XTHSQM AND A.KCCKDM=B.KCCKDM AND A.KCWPDM=B.KCWPDM AND A.KCCKSL<>B.KCCZSL

#11


在sql server中
UPDATE KCH05_TEST SET KCCKSL=B.KCCZSL FROM KCH05_TEST A Inner JOIN KCH6SUM05Y B ON A.XTDWDM=B.XTDWDM AND A.XTHSQM=B.XTHSQM AND A.KCCKDM=B.KCCKDM AND A.KCWPDM=B.KCWPDM 

#12


“无法将 NULL 值插入列 'KCCKSL',表 'KCH05_TEST';该列不允许空值。UPDATE 失败。”
則稍改一點
UPDATE KCH05_TEST SET KCCKSL=B.KCCZSL FROM KCH05_TEST A Inner JOIN KCH6SUM05Y B ON A.XTDWDM=B.XTDWDM AND A.XTHSQM=B.XTHSQM AND A.KCCKDM=B.KCCKDM AND A.KCWPDM=B.KCWPDM 
 where  B.KCCZSL is not null

#13


改写成标准SQL:
UPDATE KCH05_TEST SET KCCKSL=B.KCCZSL FROM KCH05_TEST A, KCH6SUM05Y B where A.XTDWDM=B.XTDWDM AND A.XTHSQM=B.XTHSQM AND A.KCCKDM=B.KCCKDM AND A.KCWPDM=B.KCWPDM AND A.KCCKSL<>B.KCCZSL

#14


Softlee81307(孔腎) :
Inner Join 和 Join 都是内联接嘛,一个道理啊,和我第一种写法一样的嘛
第一种写法在MS-Sqlserver中已测试通过了,只是想将这种写法应用到DB2中去却不能通过



#15


pbsql(风云):
我用你的方法在MS-Sqlserver中已测试通过,可在DB2中测试还是没有通过(提示:表 KCH05_test 的列 KCCKSL 中不允许有空值)


我的最终目的是要DB2中完成这种更新,老大你还有其它招么?

#16


weihthchk(Spectrum):
谢谢,你的方法在MS-SQLSERVER中可以通过,不过不是我想要的

#17


没搞过DB2,帮你顶下

#18


UPDATE KCH05_TEST SET KCCKSL=B.KCCZSL FROM KCH05_TEST A JOIN KCH6SUM05Y B ON A.XTDWDM=B.XTDWDM AND A.XTHSQM=B.XTHSQM AND A.KCCKDM=B.KCCKDM AND A.KCWPDM=B.KCWPDM AND A.KCCKSL<>B.KCCZSL

上面这种写法在IBM DB2中怎么写,有没人知道,答完立即结贴!

#19


没用过DB2

#1


2,加个条件就是了:
UPDATE KCH05_TEST SET KCCKSL=(SELECT B.KCCZSL FROM KCH6SUM05Y B WHERE kch05_test.XTDWDM=B.XTDWDM AND kch05_test.XTHSQM=B.XTHSQM AND kch05_test.KCCKDM=B.KCCKDM AND kch05_test.KCWPDM=B.KCWPDM)
where exists(SELECT * FROM KCH6SUM05Y B WHERE kch05_test.XTDWDM=B.XTDWDM AND kch05_test.XTHSQM=B.XTHSQM AND kch05_test.KCCKDM=B.KCCKDM AND kch05_test.KCWPDM=B.KCWPDM)

#2


晕!
大哥,第二种写法还能再简化的么?

#3


表B的“组织”、“月份”、“仓库”、“物品”与A表存在相同记录的情况下才去更新A表,有那么多条件,没法再简化了。

#4


(1)第一种方法在DB2环境下怎么写?
----------------------------------------
不是吧,DB2难道不支持这么简单的语法?

(2)按风云的写法了

#5


update tb1 set field='value' from tb1 inner join tb2 on tb1.a1=tb2.a1

#6


needkey(一头雾水) :
第一种写法在DB2 里不行,提示:“未定义列限定词或表 B ”

huwei2003(凡) :
看不懂,什么意思啊?


#7


up

#8


(2)第二种方法在MS SQLSERVER环境下怎么改?
UPDATE KCH05_TEST SET KCCKSL=B.KCCZSL FROM KCH05_TEST A Inner JOIN KCH6SUM05Y B ON A.XTDWDM=B.XTDWDM AND A.XTHSQM=B.XTHSQM AND A.KCCKDM=B.KCCKDM AND A.KCWPDM=B.KCWPDM AND A.KCCKSL<>B.KCCZSL

#9


Softlee81307(孔腎):
这不就是我的第一种写法么?
我想问的是UPDATE A SET A.KCCKSL=(SELECT B.KCCZSL。。。。)这种写法以前见过的好像不用在句尾加 where exists 子句,可今天如果不加该子句则不能通过,提示:
“无法将 NULL 值插入列 'KCCKSL',表 'KCH05_TEST';该列不允许空值。UPDATE 失败。”

另外,(1)第一种方法在DB2环境下怎么写?若有人知道小弟另开贴送50分
(注:CSDN DB2那版没人气,不想在那问)

#10


UPDATE KCH05_TEST SET KCCKSL=B.KCCZSL FROM KCH05_TEST A Inner JOIN  ----這裡加inner 就行了
KCH6SUM05Y B ON A.XTDWDM=B.XTDWDM AND A.XTHSQM=B.XTHSQM AND A.KCCKDM=B.KCCKDM AND A.KCWPDM=B.KCWPDM AND A.KCCKSL<>B.KCCZSL

#11


在sql server中
UPDATE KCH05_TEST SET KCCKSL=B.KCCZSL FROM KCH05_TEST A Inner JOIN KCH6SUM05Y B ON A.XTDWDM=B.XTDWDM AND A.XTHSQM=B.XTHSQM AND A.KCCKDM=B.KCCKDM AND A.KCWPDM=B.KCWPDM 

#12


“无法将 NULL 值插入列 'KCCKSL',表 'KCH05_TEST';该列不允许空值。UPDATE 失败。”
則稍改一點
UPDATE KCH05_TEST SET KCCKSL=B.KCCZSL FROM KCH05_TEST A Inner JOIN KCH6SUM05Y B ON A.XTDWDM=B.XTDWDM AND A.XTHSQM=B.XTHSQM AND A.KCCKDM=B.KCCKDM AND A.KCWPDM=B.KCWPDM 
 where  B.KCCZSL is not null

#13


改写成标准SQL:
UPDATE KCH05_TEST SET KCCKSL=B.KCCZSL FROM KCH05_TEST A, KCH6SUM05Y B where A.XTDWDM=B.XTDWDM AND A.XTHSQM=B.XTHSQM AND A.KCCKDM=B.KCCKDM AND A.KCWPDM=B.KCWPDM AND A.KCCKSL<>B.KCCZSL

#14


Softlee81307(孔腎) :
Inner Join 和 Join 都是内联接嘛,一个道理啊,和我第一种写法一样的嘛
第一种写法在MS-Sqlserver中已测试通过了,只是想将这种写法应用到DB2中去却不能通过



#15


pbsql(风云):
我用你的方法在MS-Sqlserver中已测试通过,可在DB2中测试还是没有通过(提示:表 KCH05_test 的列 KCCKSL 中不允许有空值)


我的最终目的是要DB2中完成这种更新,老大你还有其它招么?

#16


weihthchk(Spectrum):
谢谢,你的方法在MS-SQLSERVER中可以通过,不过不是我想要的

#17


没搞过DB2,帮你顶下

#18


UPDATE KCH05_TEST SET KCCKSL=B.KCCZSL FROM KCH05_TEST A JOIN KCH6SUM05Y B ON A.XTDWDM=B.XTDWDM AND A.XTHSQM=B.XTHSQM AND A.KCCKDM=B.KCCKDM AND A.KCWPDM=B.KCWPDM AND A.KCCKSL<>B.KCCZSL

上面这种写法在IBM DB2中怎么写,有没人知道,答完立即结贴!

#19


没用过DB2

#20