注意:mysql中不支持全关联,支持左外,右外关联,oracle支持全关联查询
1.今天做了这么一个需求,简单抽离说明一下:操作表:biz_pu_arrival_detail 关联表:ba_inventory
需求是将 关联表中的 propertyId 赋值给 操作表中的propertyId,关联条件是操作表中的 inventoryId字段和关联表中的id 关联。
错误解答:开始写的sql是这样的:
UPDATE (SELECT detail.id,detail.propertyId,ba.propertyId AS pid FROM biz_pu_arrival_detail detail JOIN ba_inventory ba ON detail.inventoryId = ba.id WHERE detail.`propertyId` IS NULL AND detail.orgid =4967219392022528) a SET a.propertyId = a.pid ;
因为 update table t set t.oldName = t.newName 是可以执行的;
但是执行结果报The target table a of the UPDATE is not updatable,原因是不能对虚拟视图做操作,update数据需要对物理表操作;
正确解答:
UPDATE biz_pu_arrival_detail detail
JOIN ba_inventory ba ON ba.orgId = detail.orgId AND detail.inventoryId = ba.id
SET detail.propertyId = ba.propertyId
WHERE detail.`propertyId` IS NULL AND detail.orgid =4967219392022528;
知识点:关联语句不仅仅只有关联查询,还可以关联更新,同样可以关联删除操作,之前只知道可以关联查询,特此记录
2.具体关联形式
2.1 双等号关联
select a.*,b.* from a,b where a.pid = b.pid
2.2 外关联(左外关联,右外关联,全外关联)
select a.*,b.* from a
left(right,full)(outer )join b on a.pid = b.pid
where a.name is not null ...
左外和右外关联 只是主表不同,在 a,b表中有对应不上的数据时,如果左外关联 那么会把a 中的所有数据查询,b表中没有对应的关联数据时,为null,右外关联相反,全外关联 是左外和右外的和
2.3 内关联
select a.* ,b.* from a join b on a.pid =b.pid
或者 select a.*, b.* from a inner join b on a.pid = b.pid;
加个塞!!!!
之前做了一个需要更新大字段text类型的字段内容,内容用于关键字匹配用,现在需要增加关键字了,如何更新,这里因为数据库不止一个,需要写升级脚本,同时执行
正常字段的update:update table set column1 = '' where id = 123;
道理一样text更新内容:update table set keyStr = concat(keyStr,'abc',' def') where id = 123;