首页新闻找找看学习计划

为什么如下的这句Sql编译器不报错?

0
悬赏园豆:20 [已解决问题] 解决于 2019-09-25 08:04

子查询中的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')

0==1&1==0的主页 0==1&1==0 | 初学一级 | 园豆:127
提问于:2019-09-19 11:59
< >
分享
最佳答案
0

没指定列表属于的表,因此会整个查询中搜索
涉及多表时,最好设置表别名
select distinct RsjhId from #RsData r with(nolock) where r.Ycllx = 'YZK' 如这种就不存出现问题了

收获园豆:20
2012 | 专家六级 |园豆:18771 | 2019-09-19 13:50
其他回答(2)
0

使用临时表要小心,临时表是执行时才创建到内存的表,编译器检查不了。

例如我在C#、java 在同一个数据库连接上用代码创建一个临时表,接着调用会使用到这个临时表的执行存储过程。
编译器不会说的我的存储过程有问题。

geass.. | 园豆:1728 (小虾三级) | 2019-09-19 13:54
0

写sql时候最好加上前缀,分层的话tt1,t1等等。
方便区分表,也不会错误问题了

select t1.id,t2.id from a t1,b t2 where t1.id=t2.id
张朋举 | 园豆:1295 (小虾三级) | 2019-09-19 14:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册