子查询中的Ycllx这一列在#RsData并不存在,而是前面MES_Prcj_Rsjhdd的一列,是编译器就近选择列名吗?为什么会就近选择当前子查询表中不存在的一列?为什么会有这种机制,这样做导致查错比较困难啊
select RsjhId, Jhycllx, Ysycllx, YclGuid, Pcsl into #RsData from A where Pcsl > 0
select RsjhId, Yyzkh, Ycllx, YclGuid, Yyzkh RootNum, 1 IsRootData
from MES_Prcj_Rsjhdd with(nolock) where RsjhId in (select distinct RsjhId from #RsData with(nolock) where Ycllx = 'YZK')
没指定列表属于的表,因此会整个查询中搜索
涉及多表时,最好设置表别名
select distinct RsjhId from #RsData r with(nolock) where r.Ycllx = 'YZK' 如这种就不存出现问题了
使用临时表要小心,临时表是执行时才创建到内存的表,编译器检查不了。
例如我在C#、java 在同一个数据库连接上用代码创建一个临时表,接着调用会使用到这个临时表的执行存储过程。
编译器不会说的我的存储过程有问题。
写sql时候最好加上前缀,分层的话tt1,t1等等。
方便区分表,也不会错误问题了
select t1.id,t2.id from a t1,b t2 where t1.id=t2.id