解释一条sql语句

web_code 2014-09-25 02:23:28
网上搜索 分组取前3条 看到的帖子 不明白 大意如下

select * from 表 as t
where (select count(*) from 表 where 分类ID = t.分类ID and 名称 < t.名称) < 2
求这句的意思

帖子地址http://bbs.csdn.net/topics/110062070
...全文
154 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
web_code 2014-09-25
  • 打赏
  • 举报
回复
就看你这么晚的份上 分都给你了
xiaodongni 2014-09-25
  • 打赏
  • 举报
回复
引用 11 楼 web_code 的回复:
意思我大概也懂 怎么有这种写法 where语句里面能这样写 感觉奇怪 没有见过 where(select count(*)...<2)
没见过是没怎么见过。你知道大概思路就好了。
web_code 2014-09-25
  • 打赏
  • 举报
回复
意思我大概也懂 怎么有这种写法 where语句里面能这样写 感觉奇怪 没有见过 where(select count(*)...<2)
xiaodongni 2014-09-25
  • 打赏
  • 举报
回复
引用 9 楼 web_code 的回复:
还是不懂啊 能不能具体点
我这个7楼回答还不具体?
web_code 2014-09-25
  • 打赏
  • 举报
回复
还是不懂啊 能不能具体点
jayzhihui 2014-09-25
  • 打赏
  • 举报
回复
select * from 表 as t where (select count(*) from 表 where 分类ID = t.分类ID and 名称 < t.名称) < 2 分类ID存在多行,统计相同ID<3的记录
xiaodongni 2014-09-25
  • 打赏
  • 举报
回复
分类ID 名称 1 2 1 3 1 4 2 1 2 2 2 3 3 4 对于上面的记录 对于第一行来说。在分类ID相同的情况下。存在0条(就是不存在)记录名称比他小。 对于第二行来说。在分类ID相同的情况下。存在1条(就是不存在)记录名称比他小 对于第三行来说。在分类ID相同的情况下。存在2条(就是不存在)记录名称比他小 对于分类ID=1的情况 只有前面2行符合条件。下面的同理。 实际上就是选择出每个分类ID 按照名称进行升序排列的前2行。
xiaodongni 2014-09-25
  • 打赏
  • 举报
回复
也没见过,看到这个第一反应就是会报错。
xiaodongni 2014-09-25
  • 打赏
  • 举报
回复
好想法 ,虽然效率比ROW_NUMBER 要差。 (select count(*) from 表 where 分类ID = t.分类ID and 名称 < t.名称) < 2 这个条件是对于最后SELECT 出来的结果 在他们的分类ID相同情况下。不能存在2条记录 比这条的名称小。 所以最终会选择每个分类ID 的2个最小的名称!
發糞塗牆 2014-09-25
  • 打赏
  • 举报
回复
这种代码我几乎就没见到过,我能感性理解,但是不知道怎么说给你听,作为建议,不要用这种写法
web_code 2014-09-25
  • 打赏
  • 举报
回复
麻烦给我解释下 上面的where(select count(*)...<2)是啥意思
發糞塗牆 2014-09-25
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author  :DBA_HuangZJ(發糞塗牆)
-- Date    :2014-09-25 14:31:05
-- Version:
--      Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 
--	May 14 2014 18:34:29 
--	Copyright (c) Microsoft Corporation
--	Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go 
create table [huang]([名称] varchar(3),[分类ID] int)
insert [huang]
select '甲1',1 union all
select '乙1',2 union all
select '丙1',3 union all
select '丁1',4 union all
select '戊1',5 union all
select '己1',6 union all
select '甲2',1 union all
select '乙2',2 union all
select '丙2',3 union all
select '丁2',4 union all
select '戊2',5 union all
select '己2',6 union all
select '甲3',1 union all
select '乙3',2 union all
select '丙3',3 union all
select '丁3',4 union all
select '戊3',5 union all
select '己3',6 union all
select '甲4',1 union all
select '乙4',2 union all
select '丙4',3 union all
select '丁4',4 union all
select '戊4',5 union all
select '己4',6 union all
select '甲5',1 union all
select '乙5',2 union all
select '丙5',3 union all
select '丁5',4 union all
select '戊5',5 union all
select '己5',6 union all
select '甲6',1 union all
select '乙6',2 union all
select '丙6',3 union all
select '丁6',4 union all
select '戊6',5 union all
select '己6',6
--------------开始查询--------------------------
SELECT 名称,分类id
FROM (
select * ,ROW_NUMBER()OVER(PARTITION BY 分类ID ORDER BY GETDATE())id
from [huang])a
WHERE id<=3
----------------结果----------------------------
/* 
名称   分类id
---- -----------
甲1   1
甲2   1
甲3   1
乙6   2
乙5   2
乙4   2
丙1   3
丙2   3
丙3   3
丁6   4
丁5   4
丁4   4
戊1   5
戊2   5
戊3   5
己6   6
己5   6
己4   6
*/
發糞塗牆 2014-09-25
  • 打赏
  • 举报
回复
这种写法阅读性太低了,高版本的SQLserver应该换别的写法,比如窗口函数

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧