自己写了一个,但是比较复杂,还请各位大哥指点一下
有A表和B表,A表是数据表,B表是配置表
A表结构如下 而B表结构如下a b a b
2 234567 1 234
3 3456456 2 3456
4 34556456 3 3455
5 34534545 4 65546
…… ……结果就是需要找到A.b中开头与 B.b开头一样的数据,然后将A.a=B.a具体来说就是假如 substr(A.b,1,3)=234,则A.a=1
假如substr(A.b,1,4)=3456,则A.a=2其中B.b所有项都是唯一的
B.a也是唯一的A表的数据量较大,请教各位该怎么写这个update 语句啊
存储过程也可以,但是尽量简约,谢谢拉
有A表和B表,A表是数据表,B表是配置表
A表结构如下 而B表结构如下a b a b
2 234567 1 234
3 3456456 2 3456
4 34556456 3 3455
5 34534545 4 65546
…… ……结果就是需要找到A.b中开头与 B.b开头一样的数据,然后将A.a=B.a具体来说就是假如 substr(A.b,1,3)=234,则A.a=1
假如substr(A.b,1,4)=3456,则A.a=2其中B.b所有项都是唯一的
B.a也是唯一的A表的数据量较大,请教各位该怎么写这个update 语句啊
存储过程也可以,但是尽量简约,谢谢拉
解决方案 »
- oracle odbc 报无法加载驱动程序因为存在系统错误代码998
- 请教 求字段最大值的最优 方法
- oracle高性能优化
- select max(ID) from organization 把它取出来后怎么处理才能 insert到 varchar类型的列里?
- 求助!简单的查询语句,进来看看
- 我在客户端 访问ORACLE时遇见ora-06401:netcmn:无效的驱动程序指示符
- 很菜的问题
- 如何提高含有blob字段表的查询速度?????????
- 学习er模型,谁给我解释下这段话的含义?
- 最近做一个存储过程拆分数据
- 提示无效的sql语句, 请问是怎么回事?
- 如何确定某一天所在的周是一年的第几周?
set A.a = (select B.a from B where substr(A.b, 1, length(B.b)) = B.b)
where exists (select 1 from B where substr(A.b, 1, length(B.b)) = B.b)
SQL> select * from A;A B
---------- --------------------
2 23456
3 3456456SQL> select * from B;A B
---------- --------------------
1 234
2 3456SQL> update A tableA set tableA.a = (select B.a from B where substr(tableA.b,1,length(B.b)) = B.b)
2 where exists (
3 select 1 from B where substr(tableA.b,1,length(B.b)) = B.b
4 );2 rows updated.SQL> select * from A;A B
---------- --------------------
1 23456
2 3456456SQL>
SET A.A=(SELECT nvl(B.A,a.a) FROM B WHERE A.B LIKE B.B||'%')
WHERE EXISTS(SELECT 1 FROM b WHERE A.B LIKE B.B||'%' )
SET A.A=(SELECT B.A FROM B WHERE A.B LIKE B.B||'%')
WHERE EXISTS(SELECT 1 FROM b WHERE A.B LIKE B.B||'%' )
update A
set A.a=(select B.a where instr(ltrim(rtrim(A.b)),ltrim(rtrim(B.b)),1,1)=1)
where A.b in (select A.b where instr(ltrim(rtrim(A.b)),ltrim(rtrim(B.b)),1,1)=1)
如按楼主所说,则实现起来要有条件,比如:A.b中开头与 B.b开头一样的数据是否唯一对应,A.a,A.b是否也是唯一的?如不是唯一对应,则可能会造成对A表的同一条记录更改N次,且sql是无法实现的,只能调用存储过程。如是唯一对应,则可参考下下面的sql
update A
set A.a=(select B.a where instr(A.b,B.b,1,1)=1)
where A.b in (select A.b where instr(A.b,B.b,1,1)=1)
A B
1 234567
2 3456456
3 34556456
1 34534545
---------------------
--注意B为2345,234的那两条记录
SELECT * FROM B
A B
5 2345
1 234
2 3456
3 3455
4 65546
--------
--执行我的更新语句
--执行你们2个的也一样~
UPDATE A
SET A.A=(SELECT nvl(B.A,a.a) FROM B WHERE A.B LIKE B.B||'%')
WHERE EXISTS(SELECT 1 FROM b WHERE A.B LIKE B.B||'%' )
--报错为单行子查询返回多个值
--归根结底的问题就是表A中的23456这条记录再表B中有2345,234两条记录与之相对应,这样的情况该如何处理,就需要LZ提出更明确的需求了