1. 了解表的连接原理,能力进阶的关键
1) 灵活性,左连接,右连接。。。
2) 查询效率,条件语句的写法和顺序,自己掌握优化的主动权。
3) 保证正确,如update from累加修改时
update tMembers
set
iShareA = a.iShareA + b.iNewShare
from vMembers a, (select * from vMembers) b
where a.iMemberID = b.iUpMemberID
与
update tMembers
set
iShareA = a.iShareA + b.iNewShare
from tMembers a, (select * from vMembers) b
where a.iMemberID = b.iUpMemberID
区别:
使用视图时,左侧iShareA 和 右侧a.iShareA不是同一条记录;使用表时是一条。
iShareA = a.iShareA + b.iNewShare
2. 一些经验
2.1 善用临时表
1)避免多用户重名冲突。
2) 速度快,内存表。
3) 简化逻辑
4) 数据重用
2.2 回避not in 的技巧
--打标记bMark = 1(下一步对bMark = 0 的进行插入,这样速度快得多)
update #tWIV_Total set bMark = 1
from
#tWIV_Total a, tTWAccount b
where
a.cWhsID = b.cWhsID and a.cItemID = b.cItemID and a.cVendorID = b.cVendorID
-- 3)将bMark = 0 的关键字插入到tTWAccount中
insert into tTWAccount (cWhsID, cItemID, cVendorID, cCtrGrpID)
select
cWhsID,
cItemID,
cVendorID,
'' -- because not null
from
#tWIV_Total
where
bMark = 0
2.3 浮点数慎用
1) 会有芯片运算影响等问题
2) 累计求和时,舍入误差,经常产生“1分钱问题”。
3) 运行中产生意外结果,如判断 = 0,本来是0,可能判断结果不为0
2.4 统计数字作分母时,注意筛选条件加上<> 0限制,如
select iLevel, count(*) iCount
into #tChainLevelCount
from tMembers a, tChainLevel b
where
a.iLevel = b.iID
and a.cState = '0' and b.cType = 'A'
group by iLevel
having count(*) > 0