weixin_44046998 2019-02-19 16:32 采纳率: 0%
浏览 543

复杂sql,请大神解析,没办法理解以下这条sql语句。

sql在以下网址第六题:
http://www.cnblogs.com/netserver/p/4518995.html
(里面有建表语句)

select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name,a.val ;

想了半天,我始终无法理解这条语句是怎么做到筛选出最大的2条val值的,并且如果做到了分组了的呢?都没见到有group by这条语句。这条嵌套查询究竟做了什么?有大神能详细解释下吗,感谢。一有这种和查询的表直接嵌套的我都有点懵 ,目前还没用过。。。常用的都是外连接,内连接,自连接,多表连接这些都能理解。因为理解这些只需要搞清楚执行顺序,还有一些基础知识就差不多了。像上面这种真的不知道在干啥啊?

  • 写回答

3条回答 默认 最新

  • 溪水人家 2019-02-19 16:55
    关注

    可以想象成表tb互相join查找, 嵌套查询是找name相同时候,比val值大的记录数目,如果记录数小于2,那说明这条记录就是最大的两条之一了。
    最后是按名字,val排序输出。

    具体分析一下:
    第一条记录为 a 2 a2(a的第二个值)
    嵌套查询是从tb表中找name=a 并且val>2的记录,数个数(count*) 一共是0条,小于2,所以第一条记录满足条件,是最大的2条记录之一。
    依次执行
    到第五条记录 b 3 b3:b的第三个值
    从tb表找name=b,并且val>3的记录,一共是2条,那么2不小于2,所以这一条不满足。

    最后按name,val排序得到结果。

    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作