A和B,问把Ajava乱码中文变为问号B需要改变多少位

查看:5452|回复:18
oracle数据库中:
有表A和表B(关联关系为:A.TID=B.ATOBTID& &&&且A.TID在数据库中为自增,A表中每增加一条数据,则A.TID自增1)
目前表A与表B为一对多关系,现想将表A与表B修改为一对一的关系(即需要根据B表向A表中插入记录)
求大神指点,本人对数据库方面的脚本一窍不通,最好是能提供详细的解决方案
详细说明:
<font color="#)现在A表中的TID对应关联了B表中的N条记录,但实际应该是1对1的关系,这是前期设计的时候遗留的问题,所以现在需要弄成1对1的关系.
2)A:B如果是1:N,那需要向A表中插入N-1条对应的A的记录,这些记录唯一不同的就是A.TID,这个TID是主键,每次在最大值的基础上自增 1
3)另外,还需要将B中的另外N-1条记录中的B.B.ATOBTID与刚才插入的到A表的N-1条记录的TID,进行一一对应上
目前数据库关联关系
(10.72 KB)
更新后数据库关联关系
高级工程师
引用:原帖由 simlink_zhaojh 于
11:05 发表
oracle数据库中:
有表A和表B(关联关系为:A.TID=B.ATOBTID& &&&且A.TID在数据库中为自增,A表中每增加一条数据,则A.TID自增1)
目前表A与表B为一对多关系,现想将表A与表B修改为一对一的关系(即需要根据B表向A表中插入记录)
求大 ... A表最终结果的TID是否可以全是新值,而不保留原来的旧值?
引用:原帖由 bfc99 于
12:31 发表
A表最终结果的TID是否可以全是新值,而不保留原来的旧值? 但是如果弃用旧值,全是新值的话实现起来容易的多,也可以,但最好的方式是:B表中应该有一条记录对应原来的A表中的旧的TID值。
您如果有方案的话,可以帮忙理下吗,谢谢
高级工程师
引用:原帖由 simlink_zhaojh 于
13:36 发表
但是如果弃用旧值,全是新值的话实现起来容易的多,也可以,但最好的方式是:B表中应该有一条记录对应原来的A表中的旧的TID值。
您如果有方案的话,可以帮忙理下吗,谢谢 ... 1、创建一个序列seq_a_tid,从A表中最大的TID的下一个开始,步长为1.用于在后面生成所需的TID。
2、备份相关表,以备后用。
3、A表和B表左关联,创建处理中间表。
& &create table temp_table as
& &select a.tid a_tid,seq_a_tid.nextval new_tid,a.xingming,a.xingbie,
& && && & b.tid b_tid,b.atobtid,b.address,0 flag
& &from a left join b on a.tid=b.
4、在中间表中标记需要修改A表TID和B表ATOBTID值的行。
& &update temp_table
& &&&set flag=1
& &&&where b_tid not in (select min(tid) from b group by atobtid);
5、将中间表中flag列为1的记录的a_tid和atobid修改为new_tid的值。
& &update temp_table
& &&&set a_tid=new_tid,
& && && &atobtid=new_tid
& &where flag=1;
6、将修改后的temp_table表中的记录,分别插回A表和B表
& &insert into a select a_tid,xingming,xingbie from temp_table where flag=1;
& &insert into b select b_tid,atobtid,address from temp_table where flag=1;
7、检查和验证数据的正确性和完整性,若有错误,参考temp_table进行分析和处理。
引用:原帖由 bfc99 于
17:11 发表
1、创建一个序列seq_a_tid,从A表中最大的TID的下一个开始,步长为1.用于在后面生成所需的TID。
2、备份相关表,以备后用。
3、A表和B表左关联,创建处理中间表。
& &create table temp_table as
& &select a.tid a_tid,seq ... 非常感谢提供的方案,很详细,我明天好好研究下,如果有不明白的地方还得再请教。
高级工程师
引用:原帖由 simlink_zhaojh 于
17:25 发表
非常感谢提供的方案,很详细,我明天好好研究下,如果有不明白的地方还得再请教。 更正一下,第6步对B表的处理应该是更新,不是插入。通过TID关联。
&&set atobtid=(select new_tid from temp_table t where b.tid=t.b_tid and t.flag=1)
&&where exists (select 1 from temp_table t where t.tid=b.tid and t.flag=1);
引用:原帖由 bfc99 于
09:28 发表
更正一下,第6步对B表的处理应该是更新,不是插入。通过TID关联。
&&set atobtid=(select new_tid from temp_table t where b.tid=t.b_tid and t.flag=1)
&&where exists (select 1 from temp_table t where t ... 谢谢!今天来了一直在处理其他问题,还没来得及研究
引用:原帖由 bfc99 于
09:28 发表
更正一下,第6步对B表的处理应该是更新,不是插入。通过TID关联。
&&set atobtid=(select new_tid from temp_table t where b.tid=t.b_tid and t.flag=1)
&&where exists (select 1 from temp_table t where t ... 这个方案完全满足需求,非常感谢!
但是我在正式库(大概有100多万条数据)中执行的时候,当执行到第4步的时候,执行了一个多小时还没执行完,不知道能从哪些方面进行优化下?
4、在中间表中标记需要修改A表TID和B表ATOBTID值的行。
& &update temp_table
& &&&set flag=1
& &&&where b_tid not in (select min(tid) from b group by atobtid);
高级工程师
引用:原帖由 simlink_zhaojh 于
17:06 发表
这个方案完全满足需求,非常感谢!
但是我在正式库(大概有100多万条数据)中执行的时候,当执行到第4步的时候,执行了一个多小时还没执行完,不知道能从哪些方面进行优化下?
4、在中间表中标记需要修改A表TID和B表ATOBTID值的行 ... 提供该语句的执行计划和统计信息。
引用:原帖由 bfc99 于
18:18 发表
提供该语句的执行计划和统计信息。 用sql/plus直接执行语句就卡死了,这个截图是通过pl/sql获得的执行计划的信息。
就是执行的这个语句
4、在中间表中标记需要修改A表TID和B表ATOBTID值的行。
& &update temp_table
& &&&set flag=1
& &&&where b_tid not in (select min(tid) from b group by atobtid);
单独执行where之前的语句的执行计划是后面的图中显示
update temp_table
& &&&set flag=1
(18.31 KB)
(11.95 KB)
本帖最后由 simlink_zhaojh 于
13:48 编辑
高级工程师
引用:原帖由 simlink_zhaojh 于
13:39 发表
用sql/plus直接执行语句就卡死了,这个截图是通过pl/sql获得的执行计划的信息。
就是执行的这个语句
4、在中间表中标记需要修改A表TID和B表ATOBTID值的行。
& &update temp_table
& &&&set flag=1
& &&&where b_tid ... 试试把NOT IN改成IN:
& &update temp_table
& &&&set flag=1
& &&&where b_tid in (select min(tid) from b group by atobtid);
但此后所有条件中有“flag=1”的条件处,要改写为“flag&&1 or flag is null”
高级工程师
引用:原帖由 simlink_zhaojh 于
13:39 发表
用sql/plus直接执行语句就卡死了,这个截图是通过pl/sql获得的执行计划的信息。
就是执行的这个语句
4、在中间表中标记需要修改A表TID和B表ATOBTID值的行。
& &update temp_table
& &&&set flag=1
& &&&where b_tid ... 或者在第3步创建临时表时,增加对数据进行过滤的操作,只将需要处理的数据加入。从而取消第4步的操作。
create table temp_table as
& &select a.tid a_tid,seq_a_tid.nextval new_tid,a.xingming,a.xingbie,
& && && & b.tid b_tid,b.atobtid,b.address,1 flag
& &from a left join b on a.tid=b.atobtid
& &where b.tid not in (select min(tid) from b group by atobtid);
引用:原帖由 bfc99 于
14:26 发表
试试把NOT IN改成IN:
& &update temp_table
& &&&set flag=1
& &&&where b_tid in (select min(tid) from b group by atobtid);
但此后所有条件中有“flag=1”的条件处,要改写为“flag1 or flag is null ... 谢谢了,就去掉了一个not立马就提速了。
引用:原帖由 simlink_zhaojh 于
14:40 发表
谢谢了,就去掉了一个not立马就提速了。 update b
&&set atobtid=(select new_tid from temp_table t where b.tid=t.b_tid and t.flag=0)
&&where exists (select 1 from temp_table t where t.tid=b.tid and t.flag=0);
这条语句执行的时候也一直在运行中,但是看了执行计划也还好,但就是一直在执行中,后来我把这个语句的where条件去掉了,改成了下面的,还是不行,不知道什么原因?
&&set atobtid=(select new_tid from temp_table t where b.tid=t.b_tid and t.flag=0)【没有看太明白where exits这个语句的意思,是不是去掉跟加上是一个效果呢?】
(12.38 KB)
本帖最后由 simlink_zhaojh 于
17:11 编辑
高级工程师
引用:原帖由 simlink_zhaojh 于
17:07 发表
&&set atobtid=(select new_tid from temp_table t where b.tid=t.b_tid and t.flag=0)
&&where exists (select 1 from temp_table t where t.tid=b.tid and t.flag=0);
这条语句执行的时候也一直在 ... 1、可以改用merge into语句试试
& &merge into b
& &using (select b_tid,new_tid from temp_table where flag&&1 or flag is null) t1
& &on (b.tid=t1.b_tid)
& &when matched then
& &&&update set b.atobtid=t1.new_
2、如果没有exists语句,对于B表中那些不能根据“t.tid=b.tid and t.flag=0”匹配上的记录的atobtid列的值,会被置为空。举例来说:
假设a表的内容如下:
id& &&&col1
b表内容如下:
id& & col1
现在要求用b表的col1列内容更新a表中与其id相一致的记录。所以,更新后,a表的内容应为:
id& &&&col1
但如果你是用如下语句更新的,则结果就会不一样:
update a set col1 = (select col1 from b where b.id=a.id);
结果变为:
id& &&&col1
而如果是用如下语句更新,则可以实现我们预期的结果:
update a set col1=(select col1 from b where a.id=b.id)
where exists (select 1 from a.id=b.id);
引用:原帖由 bfc99 于
09:32 发表
1、可以改用merge into语句试试
& &merge into b
& &using (select b_tid,new_tid from temp_table where flag1 or flag is null) t1
& &on (b.tid=t1.b_tid)
& &when matched then
& &&&update set b.atobtid=t1.n ... 解释的很详细,非常感谢!
这个问题目前基本弄好了,目前就还剩下一个表合并删除并修改关联关系的问题,跟这个问题有点儿类似,但我自己弄了下,把数据库中很多记录的关联关系都弄乱了,很多记录在产品中都找不到了(您如果方便的话,帮忙再看看,谢谢,才注册51CTO论坛,不清楚发帖规则,貌似应该新发一张贴的,我一会儿新发一张贴,然后把链接补到这儿吧)
这个问题我卡在了,不知道怎么批量的把B.ATOBTID的366的值怎么改成365
A表中存在多条冗余记录(根据local,HID,PID 进行判断是否同一条记录:local,HID必须相同,PID为空或NULL的情况可归到任意相同local,HID的记录下,local为U的所有记录均不进行处理。)
关联关系A.TID=B.ATOBTID
1、将B表中的记录的B.ATOTID 的值修改为要保留的唯一一条记录的TID
2、删除A表中冗余的记录,只保留一条记录。
(32.15 KB)
本帖最后由 simlink_zhaojh 于
15:23 编辑
引用:原帖由 bfc99 于
09:32 发表
1、可以改用merge into语句试试
& &merge into b
& &using (select b_tid,new_tid from temp_table where flag1 or flag is null) t1
& &on (b.tid=t1.b_tid)
& &when matched then
& &&&update set b.atobtid=t1.n ... 问题链接:
引用:原帖由 simlink_zhaojh 于
11:48 发表
解释的很详细,非常感谢!
这个问题目前基本弄好了,目前就还剩下一个表合并删除并修改关联关系的问题,跟这个问题有点儿类似,但我自己弄了下,把数据库中很多记录的关联关系都弄乱了,很多记录在产品中都找不到了(您如果方便 ... 这个问题我卡在了,不知道怎么把B.ATOBTID的366的值怎么改成365
高级工程师
引用:原帖由 simlink_zhaojh 于
15:21 发表
这个问题我卡在了,不知道怎么把B.ATOBTID的366的值怎么改成365 你是说那个新问题吗?如果是的话,最好在那个贴子上回复,这样便于其它网友查阅和讨论。博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)我把a的值赋给b,改变b时,a的值要不变,怎么写_百度知道
我把a的值赋给b,改变b时,a的值要不变,怎么写
楼主的问可以看出a,a和b指向的是同一对象,b应该都是引用类型的变量吧.clone(),要想不变的话,只能另外创建一个对象,说到底,然后把原来对象的属性全部复制到另一个对象中去,最后让b变量引用这个新对象。浅层复制的话可以用b=a,所以a值变了,b对应也会变,b=a时只是将a引用赋值给b,而不是把a所指的对象给b
采纳率:56%
来自团队:
这是计算机编程吧b=a 这个算法表示把a的值赋给b,此时a改变b也改变但是b改变时,a可以不变
b=a,a的值赋给b,改变b对a又没什么影响,值不会变的
为您推荐:
其他类似问题
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。整数A和B的二进制表示中有多少位是不同的?_文档库
文档库最新最全的文档下载
当前位置: & 整数A和B的二进制表示中有多少位是不同的?
整数A和B的二进制表示中有多少位是不同的?
给定两个正整数 (二进制形式表示) A 和 B , 问把 A 变为 B 需要改变多少位 (bit ) ? 也就是说, 整数 A 和 B 的二进制表示中有多少位是不同的?
解法一:举例说明,为了减少复杂度,就使用八位二进制吧。设
1. C = A & B = ;
2. D = A | B = ;
3. E = C ^ D = ;
4. 结果 E 中有 4个 1,那么也就是说将 A 变成 B ,需要改变 4位(bit ) 。
至于如何判断 E 的二进制表示中有几个 1,可以采用快速移位与方法。
算法原理如下:
1. A & B,得到的结果 C 中的 1的位表明了 A 和 B 中相同的位都是 1的位;
2. A | B,得到的结果 D 中的 1的位表明了 A 和 B 在该位至少有一个为 1的位,包含了 A 与 B 都是 1的位数,
经过前两步的位运算, , C 中 1的位表明了 A 和
B在该位都是 1, D 中为 0的位表明了 A 和 B 在该位都是 0 ,所以进行第三步。
3. C ^ D, E 中为 1的位表明了 A 和
B不同的位。
#include&iostream&
intgetNum(int n)
if(n==0) return0;
int count=0;
int main()
int A=43,B=101;
int C=A&B;
int D=A|B;
int E=C^D;
cout&&getNum(E)&&
system(&pause&);
Word文档免费下载:
个二进制位来表示整数的编码时, 十进制整数-88 ...A、芯片中组成门电路的晶体管数量 B、芯片中组成门...在硬盘的不同磁道上所存储二进制信息的密度是相同的...位十六进制数可以用( )二进制数来表示。 A、1 B...一个8位的存储单元中,能够存储的最大无符号整数是...三码 6、与模拟电路相比,数字电路主要的优点有( )...给定两个正整数 (二进制形式表示) A 和 B, 问把 A 变为 B 需要改变多少位 (bit) ?也就是说, 整数 A 和 B 的二进制表示中有多少位是不同的? 解法...标准的ASCII码用7位二进制位表示,可表示不同的编码个数是___。 A.127B.128C.255D.256正确答案及相关解析
正确答案 B
解析 [解析] 11111,化...答:用以表示整数的二进制位数. 8.为什么不可以将...其余不变;反码是将所 有二进制位中的 0 变为 1...B.二进制反码 C.二进制补码 D.a 和 b A.符号...6位二进制数最大能表示的十进制整数是___。 A.64B.63C.32D.31正确答案及相关解析
正确答案 B
解析 [知识点] 计算机中数据的表示中的十进制数与二进制...下列四个不同数制表示的数中,数值最大的是( )。 A.二进制数B.八进制数334C.十进制数219D.十六进制数DA_答案解析_2016年_一模/二模/三模/联考_...16个二进制位可表示整数的范围为( )。 A.0~65535 B.-3C.-3 D.-3或0~65535 正确答案及相关解析
正确答案 D
解析 [...使用8个二进制位来表示整数的编码时,十进制整数-88...A、100111 B、 101000 C、...能同时连接多个设备的接口.以下接口中不属于总线型...下列四个不同数制表示的数中,数值最小的是___。 A.二进制数B.八进制数334C.十进制数219D.十六进制数DA正确答案及相关解析
正确答案 D
解析 [解...}

我要回帖

更多关于 商人改变需要多久 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信