黑马程序员 有关 sqlServer 当没有用 EXISTS 引入子查询时,错误信息

来源:互联网 发布:visio mac 中文破解版 编辑:程序博客网 时间:2024/05/02 08:19
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------

 




     今天学习 sqlServer, 然后在自己试验过程中, 出现了一个问题, 具体例子请看下面语句:
select  top 3 * from emp 
where  sal not  in  (select top 5* from emp order by sal desc)
order by sal  desc
 
我的本意是想: 查询 emp表中,sal(工资) 最高的 第6名开始的 前3名;;
  算法是: 先执行  select top 5* from emp order by sal desc 子语句,  找出 emp表中 按工资排序的前5名的人的信息,
 然后用 where  not  in  过滤,,
 接着再  select top 3  本以为没有什么问题, 然后 执行后发现报错,, 错误信息如下:
 
消息 116,级别 16,状态 1,第 1 行
当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式。 

 

查找资料,再结合自己的理解, 发现错误的地方 如下:

select  top 3 * from emp 
where  sal not  in  (select top  5  sal   from emp order by sal desc)
order by sal  desc
把 * 号  改为  sal 就没有错了。 
 
 
 
我的理解是这样的:
select top  5   from emp order by sal desc  此子句是在 表格中查找所有的记录, 每条记录包含多个 字段,而
where  sal not  in  (select top 5* from emp order by sal desc)

  此句中的  sal not in 是把 sal 这个字段 按 ()中的子句查找的结果 来过滤, 很明显, ()中查找的结果是包含 多个字段的结果, 而
sal not in 是  1个字段的比较  所以出错 ,
 
 
结论: 仔细思考 我们的语句, 按照我们日常生活的逻辑去考虑我们语句达到的效果, 这样我们就能明白为什么 有的地方 的语法必须是这样的没, 为什么不能改, 为什么出错了,  仔细对照生活实际考虑问题, 有利于加深我们对 语法的理解, 更有利于我们清晰的快速的写出合理的语句。
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://net.itheima.com/
原创粉丝点击