这句sql什么意思

Mark杨 2010-05-30 09:12:19
select * from tb t where (select count(1) from tb where id<=t.id) between 10 and 20


这句sql是如何执行的 也就是原理是什么? 我看不懂!~~~
...全文
72 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoyoumou 2010-05-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 yabbi215 的回复:]
select * from tb t where (select count(1) from tb where id<=t.id) between 10 and 20


这句sql是如何执行的 也就是原理是什么? 我看不懂!~~~
[/Quote]

-- 呵呵:只有Tony兄才能写出如此之精美的语句来!
Mark杨 2010-05-30
  • 打赏
  • 举报
回复
说出来真不好意思 这句sql就是tony 原创的 我什么都没改 呵呵~~
永生天地 2010-05-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 htl258 的回复:]
引用 9 楼 xys_777 的回复:
引用 7 楼 htl258 的回复:
SQL code
--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([id] [int],[name] [nvarchar](10))
INSERT INTO [tb]
SEL……
[/Quote]
看差了,lz的也有=号,
是10-20 : 11条
htl258_Tony 2010-05-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yabbi215 的回复:]
-->Tony


这句sql和用top的哪个执行速度快
[/Quote]看总记录数的多少,记录数多的话效率应该不如TOP好,因为不管记录数多少,都要每行生成一行号。具体看执行计划。
Mark杨 2010-05-30
  • 打赏
  • 举报
回复
我不知道是什么时候的

他提问查找10到20 id主键 不连续

我看你了的答案,不理解就抓出来问了

select * from tb t where not exists
(select 1 from tb where t.位置 = 位置 and(数量<t.数量 or 数量 = t.数量 and 时间<t.时间))

这也是你的,我看有点相似的.自己又都不懂 就问了 呵呵
Mark杨 2010-05-30
  • 打赏
  • 举报
回复
-->Tony


这句sql和用top的哪个执行速度快
htl258_Tony 2010-05-30
  • 打赏
  • 举报
回复
如果没记错的话,楼主提问的代码应该是上周我在某个贴子的回复内容。
htl258_Tony 2010-05-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xys_777 的回复:]
引用 7 楼 htl258 的回复:
SQL code
--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([id] [int],[name] [nvarchar](10))
INSERT INTO [tb]
SELECT '1','a1' UNION AL……
[/Quote]哪里
Mark杨 2010-05-30
  • 打赏
  • 举报
回复
谢谢各位 好像有点理解了 我再仔细想想~~
永生天地 2010-05-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 htl258 的回复:]
SQL code
--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([id] [int],[name] [nvarchar](10))
INSERT INTO [tb]
SELECT '1','a1' UNION ALL
SELECT '3','a……
[/Quote]
这个多加了等于的
htl258_Tony 2010-05-30
  • 打赏
  • 举报
回复
--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([id] [int],[name] [nvarchar](10))
INSERT INTO [tb]
SELECT '1','a1' UNION ALL
SELECT '3','a2' UNION ALL
SELECT '6','a3' UNION ALL
SELECT '8','a4' UNION ALL
SELECT '10','a5' UNION ALL
SELECT '13','a6' UNION ALL
SELECT '15','a7' UNION ALL
SELECT '18','a8' UNION ALL
SELECT '20','a9' UNION ALL
SELECT '23','a10' UNION ALL
SELECT '25','a11' UNION ALL
SELECT '28','a12' UNION ALL
SELECT '30','a13' UNION ALL
SELECT '33','a14' UNION ALL
SELECT '35','a15' UNION ALL
SELECT '38','a16' UNION ALL
SELECT '40','a17' UNION ALL
SELECT '43','a18' UNION ALL
SELECT '45','a19' UNION ALL
SELECT '48','a20' UNION ALL
SELECT '50','a21' UNION ALL
SELECT '53','a22' UNION ALL
SELECT '55','a23' UNION ALL
SELECT '58','a24' UNION ALL
SELECT '60','a25' UNION ALL
SELECT '63','a26' UNION ALL
SELECT '65','a27' UNION ALL
SELECT '68','a28'

-->SQL查询如下:

SELECT * --3.根据筛选的条件返回结果集
FROM tb t
WHERE (
SELECT COUNT(1)
FROM tb
WHERE id<= t.id
) --1.括号内代码用来生成从1开始连续的行号
BETWEEN 10 AND 20 --2.根据生成的行号选择从第10条记录开始到第20记录的结果集
/*
id name
----------- ----------
23 a10
25 a11
28 a12
30 a13
33 a14
35 a15
38 a16
40 a17
43 a18
45 a19
48 a20

(11 行受影响)
*/
zhiguo2010 2010-05-30
  • 打赏
  • 举报
回复
内层的每一条记录与外层的当前记录进行比较,形成比较结果看是否当前记录满足条件
永生天地 2010-05-30
  • 打赏
  • 举报
回复
select * from tb t where (select count(1) from tb where id<=t.id) between 10 and 20

好像应该能取出第 11到第20条记录
htl258_Tony 2010-05-30
  • 打赏
  • 举报
回复
SELECT *   --3.根据筛选的条件返回结果集
FROM tb t
WHERE (
SELECT COUNT(1)
FROM tb
WHERE id<= t.id
) --1.括号内代码用来生成从1开始连续的行号
BETWEEN 10 AND 20 --2.根据生成的行号选择从第10条记录开始到第20记录的结果集
Mark杨 2010-05-30
  • 打赏
  • 举报
回复
这样的写法 我今天刚看见过 汗~~~

可以说都不理解,希望能详细点的解答~~

谢谢
ACMAIN_CHM 2010-05-30
  • 打赏
  • 举报
回复
建议你先自己试着解释一下这个语句,否则别人也根本不知道你目前已经懂了什么,到什么层次,到底是哪儿不懂。

写出你自己的理解,然后让别人来看你的理解是否正确。 否则别人解释过简单你还是理解不了,解释得过细,可能又是根本不必要。
ACMAIN_CHM 2010-05-30
  • 打赏
  • 举报
回复
当前记录去执行 (select count(1) from tb where id<=t.id) 的结果在10-20之间。

34,590

社区成员

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

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