M
MingWord
Unregistered / Unconfirmed
GUEST, unregistred user!
下面有两条SQL语句,作用是一样的.目标是用一条SQL语句把字段NUM1..NUM9中,相同的值的Series之差.例如
series num1
1 1
2 3
3 1
就是用SQL语句查出,Series为1时,Num1和上一次值为1时Series的差是多少,Series为2时,Num1的值3和上一次相同的值3的Series的差是多少,Series为3时,Num值同上一次值为1时Series差是多少
这个如果查出的结果是
Series Num1
1 Null
2 Null
3 2
我下面写了两个语句,结果得出是一样,但是运行时间有问题,一个是14秒,一个是45秒,但是数据库只有1850多数据.有没有高手可以写出更快的语句?因为如果数据多时,会很要命的.而且这个类似的语句有很多个表要用到.一起运行,十几分钟都通不过.
////////////////////////////////////////////////////////////////////////////
第一条语句
DELETE E_S_R_Number FROM E_S_R_Number,B_S,B_ChooseType
WHERE E_S_R_Number.Item = B_S.Item AND B_S.Type_ID = B_ChooseType.Type_ID
INSERT INTO E_S_R_Number(Item,Num1,Num2,Num3,Num4,Num5,Num6,Num7,Num8,Num9)
SELECT Item, A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num1 = D.Num1 AND D.Type_id = F.Type_id ),
A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num2 = D.Num2 AND D.Type_id = F.Type_id ),
A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num3 = D.Num3 AND D.Type_id = F.Type_id ),
A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num4 = D.Num4 AND D.Type_id = F.Type_id ),
A.Series -(SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num5 = D.Num5 AND D.Type_id = F.Type_id ),
A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num6 = D.Num6 AND D.Type_id = F.Type_id ),
A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num7 = D.Num7 AND D.Type_id = F.Type_id ),
A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num8 = D.Num8 AND D.Type_id = F.Type_id ),
A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num9 = D.Num9 AND D.Type_id = F.Type_id )
FROM B_S A,B_ChooseType C
WHERE A.Type_id = C.Type_id
//////////////////////////////////////////////////////////////////////////////
第二条SQL语句
UPDATE E_S_R_Number
SET Num1 = A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num1 = D.Num1 AND D.Type_id = F.Type_id ),--1
Num2 = A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num2 = D.Num2 AND D.Type_id = F.Type_id ),--2
Num3 = A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num3 = D.Num3 AND D.Type_id = F.Type_id ),--3
Num4 = A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num4 = D.Num4 AND D.Type_id = F.Type_id ),--4
Num5 = A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num5 = D.Num5 AND D.Type_id = F.Type_id ),--5
Num6 = A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num6 = D.Num6 AND D.Type_id = F.Type_id ),--6
Num7 = A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num7 = D.Num7 AND D.Type_id = F.Type_id ),--7
Num8 = A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num8 = D.Num8 AND D.Type_id = F.Type_id ),--8
Num9 = A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num9 = D.Num9 AND D.Type_id = F.Type_id )--9
FROM B_S A,B_ChooseType C
WHERE A.Type_id = C.Type_id AND A.ITEM = E_S_R_Number.Item
series num1
1 1
2 3
3 1
就是用SQL语句查出,Series为1时,Num1和上一次值为1时Series的差是多少,Series为2时,Num1的值3和上一次相同的值3的Series的差是多少,Series为3时,Num值同上一次值为1时Series差是多少
这个如果查出的结果是
Series Num1
1 Null
2 Null
3 2
我下面写了两个语句,结果得出是一样,但是运行时间有问题,一个是14秒,一个是45秒,但是数据库只有1850多数据.有没有高手可以写出更快的语句?因为如果数据多时,会很要命的.而且这个类似的语句有很多个表要用到.一起运行,十几分钟都通不过.
////////////////////////////////////////////////////////////////////////////
第一条语句
DELETE E_S_R_Number FROM E_S_R_Number,B_S,B_ChooseType
WHERE E_S_R_Number.Item = B_S.Item AND B_S.Type_ID = B_ChooseType.Type_ID
INSERT INTO E_S_R_Number(Item,Num1,Num2,Num3,Num4,Num5,Num6,Num7,Num8,Num9)
SELECT Item, A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num1 = D.Num1 AND D.Type_id = F.Type_id ),
A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num2 = D.Num2 AND D.Type_id = F.Type_id ),
A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num3 = D.Num3 AND D.Type_id = F.Type_id ),
A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num4 = D.Num4 AND D.Type_id = F.Type_id ),
A.Series -(SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num5 = D.Num5 AND D.Type_id = F.Type_id ),
A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num6 = D.Num6 AND D.Type_id = F.Type_id ),
A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num7 = D.Num7 AND D.Type_id = F.Type_id ),
A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num8 = D.Num8 AND D.Type_id = F.Type_id ),
A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num9 = D.Num9 AND D.Type_id = F.Type_id )
FROM B_S A,B_ChooseType C
WHERE A.Type_id = C.Type_id
//////////////////////////////////////////////////////////////////////////////
第二条SQL语句
UPDATE E_S_R_Number
SET Num1 = A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num1 = D.Num1 AND D.Type_id = F.Type_id ),--1
Num2 = A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num2 = D.Num2 AND D.Type_id = F.Type_id ),--2
Num3 = A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num3 = D.Num3 AND D.Type_id = F.Type_id ),--3
Num4 = A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num4 = D.Num4 AND D.Type_id = F.Type_id ),--4
Num5 = A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num5 = D.Num5 AND D.Type_id = F.Type_id ),--5
Num6 = A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num6 = D.Num6 AND D.Type_id = F.Type_id ),--6
Num7 = A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num7 = D.Num7 AND D.Type_id = F.Type_id ),--7
Num8 = A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num8 = D.Num8 AND D.Type_id = F.Type_id ),--8
Num9 = A.Series - (SELECT MAX(D.Series) FROM B_S D,B_ChooseType F WHERE A.Series > D.Series AND A.Num9 = D.Num9 AND D.Type_id = F.Type_id )--9
FROM B_S A,B_ChooseType C
WHERE A.Type_id = C.Type_id AND A.ITEM = E_S_R_Number.Item