这条sql语句为啥会是这种结果???

梦中的RPG 2016-11-01 11:09:04
CREATE TABLE #b (
[id] [char] (10),
[name] [char] (10)
)

insert into #b(id,name) values('11','aaaa')
insert into #b(id,name) values('11','bbbb')
insert into #b(id,name) values('11','cccc')
insert into #b(id,name) values('22','dddd')
insert into #b(id,name) values('22','eeee')
insert into #b(id,name) values('22','ffff')

select * from #b b where name=(select top 1 name from #b where id=b.id)

drop table #b

结果是 id name
11 aaaa
22 dddd


如果我执行这句
select top 1 name from #b b where id=b.id 返回结果只有一个aaaa
那么select * from #b b where name='aaaa'就应该只有第一条记录啊为啥会是2条??

...全文
448 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
足球不是方的 2016-11-02
  • 打赏
  • 举报
回复
遍历 的是from 后面的表, from #b 就是遍历#b的所有记录啊
卖水果的net 版主 2016-11-02
  • 打赏
  • 举报
回复
select * from #b b where name=(select top 1 name from #b where id=b.id) 这个确实是返回 2 条记录的; 但是,返回的是哪两 2 条记录,并不稳定;你可以参考一个 4# 大版的意见; =(select top 1 name from #b where id=b.id) 前面的 id 是指本表中的 id , 而 b.id 是指外层的 id ; 显然,当 b.id = 11 时,在子查询中,要查出一个数值来,而外层只能有记录可以匹配上, b.id 共可以取两个值,一个是 11 一个是 22 ,所以取出来了两条; 如果insert into #b(id,name) values('11','aaaa') 这条语句,执行两次, 那么,这个查询的结果, 可能会是 2 条,也可能是 3 条; 也就是说的不稳定;
中国风 2016-11-02
  • 打赏
  • 举报
回复
同一ID时取第一条数据 不加排序时,Name有索引同没索引结果集会有所不同,如:
CREATE INDEX IX_#tb ON #b(ID,Name DESC);
select * from #b b where name=(select top 1 name from #b  where id=b.id)
/*id	name
11        	cccc      
22        	ffff      */
drop table #b
梦中的RPG 2016-11-02
  • 打赏
  • 举报
回复
引用 3 楼 wmxcn2000 的回复:
select top 1 name from #b b where id=b.id 返回结果只有一个aaaa TOP 1 了,所以只返回 1 条记录; 那么select * from #b b where name='aaaa'就应该只有第一条记录啊为啥会是2条?? 这个不会的,前面的数据,只有一个符合条件的;建议你再测试一下;
我的意思就是说子语句top 1 name只返回一条,那么为啥where name=(查询出的一个top1 name)会返回多条
梦中的RPG 2016-11-02
  • 打赏
  • 举报
回复
@zbdzjx select * from #b b where name=(select top 1 name from #b where id=b.id) 返回每个ID的第一条记录。 我的意思就是为啥这句话是返回每个id的第一条记录,明明子语句的top 1只会返回一条name, 那么前面的语句是where name=查询出来应该也只有一条啊
卖水果的net 版主 2016-11-02
  • 打赏
  • 举报
回复
select top 1 name from #b b where id=b.id 返回结果只有一个aaaa TOP 1 了,所以只返回 1 条记录; 那么select * from #b b where name='aaaa'就应该只有第一条记录啊为啥会是2条?? 这个不会的,前面的数据,只有一个符合条件的;建议你再测试一下;
-狙击手- 2016-11-02
  • 打赏
  • 举报
回复
你这SQL本来就是取回第一个ID的第一条呀, 你有两个ID呀
zbdzjx 2016-11-02
  • 打赏
  • 举报
回复
select * from #b b where name=(select top 1 name from #b where id=b.id) 返回每个ID的第一条记录。 select top 1 name from #b b where id=b.id 因为有top 1,所以只返回一个aaaa,至于where id=b.id,这样写没意义,等于没写。 select * from #b b where name='aaaa' 我试了,就只返回了一条记录啊。

34,590

社区成员

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

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