1.有3张表,就叫做a表、b表、c表吧(3张表的数据都很大上万条数据)。
2.首先要查询a表的所有数据,然后根据a表的条件(有4个)去查询b表的ID,然后根据b表的ID去更新c表的数据。
3.写个我现在做的简单步骤:
查询出a表的数据(select * from a),然后循环:
for(int i=0;i<a表的数据;i++)
{
//根据a表的条件去查询表的ID
select id from b
where
b.xx1 = a表.xx1
and b.xx2 = a表.xx2
and b.xx3 = a表.xx3
// 根据查询出来的ID去更新c表
update c
set xx1 = a.xx5
,xx2 = a.xx6
,xx3 = a.xx7
where
xxid = b.id
}
我现在的问题就是觉得这样很慢,影响效率,如果数据有10万条,就要查询10万次,然后在更新10万次。
各位在线的朋友们,有没有什么好的思路,在线求解答,谢谢。
可以把你这些逻辑都写成一个存储过程。
我现在是写了3个存储过程,查询两个,更新一个, 循环还是才代码中写的。
有没有其他更好的解决办法呢?
@红色小内内: 写成一个存储过程,存储过程可以包含复杂的业务逻辑,所有查询、更新、循环的逻辑代码都用SQL来写。从技术上讲,更好的解决办法,就是找个SQL很厉害的人,帮你优化下你的代码逻辑。抛开技术层面,你得从需求入手,重构架构。
如果直接写一个SQL取得那四个字段 ,然后再更新不是更好吗?
呵呵,谢谢哈。我这里提问只是简单的写了下代码, 所以查询写的是*。 在项目中我写的是我只需要的字段。 现在我是想有没有其他的思路来解决这个查询一次,然后在更新一次的方法。
@红色小内内:
如果是更新的话,可以写一个sql直接更新的,sqlserver的update 可以写查询的
如果暂时没有什么好的办法去优化的话,你可以先把这个存储过程作为一个作业,在服务器闲置的时候去执行,这样也不影响使用。
另外既然三张表有这样的关系,为什么当初不建立一个触发器呢……
写一条sql语句就好了吧
Update c Set c.xx1 = a.xx5 ,c.xx2 = a.xx6 ,c.xx3 = a.xx7 From c JOIN b on c.xxid = b.id JOIN a on b.xx1 = a.xx1 and b.xx2 = a.xx2 and b.xx3 = a.xx3
楼上的答案就已经满足