表a
id name
1 111
2 222
3 333
语句:
select a.id,a.name,b.IsEnabled
from 表a a
left join(select IsEnabled = 1) b on a.id = 1
结果:
id name IsEnabled
1 111 1
2 222 null
3 333 null
语句:
select a.id,a.name,IsEnabled = IsNull(b.IsEnabled,0)
from 表a a
left join(select IsEnabled = 1) b on a.id = 1
结果:
id name IsEnabled
1 111 1
2 222 1
3 333 1
为什么会是这样,在我感觉这两种查询出来的结果应该是一样的呀?请高人指教?
请朋友帮我看了一下,他测试是没有问题的,结果我换了一个数据库执行了一下也是没有问题的,那就是那个数据库的问题,更让不不解了。
不知道各位有没有遇到过这样的问题?
没有发现问题,但是两次确实结果不一致,你看一下你执行的实际语句,是不是和你贴出来的不一样?
按第二个结果,你的语句应该是 :
select a.id,a.name,IsEnabled = IsNull(b.IsEnabled,1)
from 表a a
left join(select IsEnabled = 1) b on a.id = 1
也就是 IsNull 的第二个参数应该是1,而不是你上面给出的0
你的第二句,结果应该是:
id name IsEnabled
1 111 1
2 222 0
3 333 0
因为从第一句的结果可以看到 IsEnabled 里有两个null,在第二句话,这两个null被替换成了0,所以应该是这个结果,你上面那个IsEnabled都是1的结果,是你把IsNull的参数写错了吧?
xuexi
刚才研究了一下,我把这两条语句使用SQL查询分析器的显示查询计划分析了一下,发现了不同
第一条不会生成b的零时表,而将on a.id = 2和三是你会发现结果中的第二条和第三条回是1,其它为零
只有on a.id=的列才不为空,其它都为空。
第二条SQL引擎在处理时会生成一个b的零时表,主要是为了isnull函数使用。
生成临时表以后对于访问就会有效,所以isnull函数计算的结果一直为1
说白了就是SQL分析时对SQL语句进行的处理方式不同而导致的。
ISNull第二个参数应该是1