经过上一贴,我明白了怎么在oracle多表条件update
比如把t-sql的:update btc_checkdata set dzfs=b.dzfs,dzfsto=b.dzfsto
from dz_ClientInfo b
where btc_checkdata.sclientid=b.sclientid and
btc_checkdata.sL2OrgID=b.sL2OrgID and
btc_checkdata.dcheckdate=sysdate;写成pl/sql的:update btc_checkdata c set
icheckmode=(select t.icheckmode from btc_clientinfo t where c.icheckmode=t.icheckmode),
scheckmodeto=(select t.scheckmodeto from btc_clientinfo t where c.scheckmodeto=t.scheckmodeto)
where sclientid=(select t.sclientid from btc_clientinfo t where c.sclientid=t.sclientid) and
sL2OrgID =(select t.sL2OrgID from btc_clientinfo t where c.sL2OrgID=t.sL2OrgID) and
dcheckdate=sysdate;理论上这是没错的吧,我也用测试表试过了,那时候很开心~~
结果今天突然遇上问题了
btc_clientinfo表客户信息表
btc_checkdata表是账单信息表
是一对多的关系
其实就算1对1关系
像里面的select t.sclientid from btc_clientinfo t where c.sclientid=t.sclientid
等就会查出不止一条的记录,所以报错ORA-01427: single-row subquery returns more than one row
我试了下把=改成in是能运行了但是和把那句注释掉的结果一样,应该不对吧
怎么t-sql里面就没有那么麻烦的情况呢。
我不知道怎么写了如果限制了子查询返回的结果那是不是又改变了原句的意思了?因为返回的结果是多条不一样的记录啊我好烦恼喔,哪位大侠可以帮帮我吗~~~~~~~非常感谢
比如把t-sql的:update btc_checkdata set dzfs=b.dzfs,dzfsto=b.dzfsto
from dz_ClientInfo b
where btc_checkdata.sclientid=b.sclientid and
btc_checkdata.sL2OrgID=b.sL2OrgID and
btc_checkdata.dcheckdate=sysdate;写成pl/sql的:update btc_checkdata c set
icheckmode=(select t.icheckmode from btc_clientinfo t where c.icheckmode=t.icheckmode),
scheckmodeto=(select t.scheckmodeto from btc_clientinfo t where c.scheckmodeto=t.scheckmodeto)
where sclientid=(select t.sclientid from btc_clientinfo t where c.sclientid=t.sclientid) and
sL2OrgID =(select t.sL2OrgID from btc_clientinfo t where c.sL2OrgID=t.sL2OrgID) and
dcheckdate=sysdate;理论上这是没错的吧,我也用测试表试过了,那时候很开心~~
结果今天突然遇上问题了
btc_clientinfo表客户信息表
btc_checkdata表是账单信息表
是一对多的关系
其实就算1对1关系
像里面的select t.sclientid from btc_clientinfo t where c.sclientid=t.sclientid
等就会查出不止一条的记录,所以报错ORA-01427: single-row subquery returns more than one row
我试了下把=改成in是能运行了但是和把那句注释掉的结果一样,应该不对吧
怎么t-sql里面就没有那么麻烦的情况呢。
我不知道怎么写了如果限制了子查询返回的结果那是不是又改变了原句的意思了?因为返回的结果是多条不一样的记录啊我好烦恼喔,哪位大侠可以帮帮我吗~~~~~~~非常感谢
select distinct t.sclientid from btc_clientinfo t where c.sclientid=t.sclientid
SET (ICHECKMODE, SCHECKMODETO) = (SELECT T.ICHECKMODE, T.SCHECKMODETO
FROM BTC_CLIENTINFO T
WHERE C.ICHECKMODE = T.ICHECKMODE
AND C.SCHECKMODETO = T.SCHECKMODETO
AND C.SL2ORGID = T.SL2ORGID
AND ROWNUM = 1)
WHERE EXISTS (SELECT T.SCLIENTID
FROM BTC_CLIENTINFO T
WHERE C.ICHECKMODE = T.ICHECKMODE
AND C.SCLIENTID = T.SCLIENTID
AND C.SL2ORGID = T.SL2ORGID)
AND DCHECKDATE = SYSDATE;
为什么t-sql里就那么简单啊1对1?要循环要游标啥的吧?
from dz_ClientInfo b
where btc_checkdata.sclientid=b.sclientid and
btc_checkdata.sL2OrgID=b.sL2OrgID and
btc_checkdata.dcheckdate=sysdate;我像问个很菜的问题
这样的联表更新句子,他的原意是如果where条件成立就更新btc_checkdata 里所有set列出的字段
还是只更新符合where条件里成立的记录字段?应该是后者吧?
(突然不让我发帖了,说我灌水,没搞错吧?)