结果集连接机制:为何两段SQL查询(q1与q2)结果不一致?
问题分析:q1与q2的结果差异原因
先把你的SQL代码整理成更易读的格式:
declare @t1 table (id int); insert into @t1(id) values(1),(2),(3); select * from @t1 declare @t2 table (id int); insert into @t2(id) values(9); select * from @t2 -- q1 select * from @t1, @t2; -- q2 select ds1.id from @t1 as ds1, (select id from @t2) as ds2
首先要明确:q1和q2的连接逻辑确实是一致的——两者都是隐式的交叉连接(笛卡尔积),也就是把@t1的每一行和@t2的每一行进行组合,底层的行组合数都是3×1=3行。那为什么结果看起来不同?核心原因在于查询返回的列不同:
q1的结果:使用
select *会返回两个表的所有列,也就是@t1.id和@t2.id,所以结果集是3行,每行包含两个id列(列名可能重复,取决于SQL Server的处理):id | id 1 | 9 2 | 9 3 | 9q2的结果:明确指定只返回
ds1.id(也就是@t1的id列),所以结果集是3行,但只有一列,内容是@t1的三个id值:id 1 2 3
另外还有一个细节:q2里的子查询(select id from @t2)其实和直接引用@t2是等价的,它并没有改变连接逻辑,只是把@t2包装成了一个别名ds2的子查询,本质还是和@t1做笛卡尔积。
总结一下:两者的连接机制(笛卡尔积)完全相同,差异只在于选择返回的列不同——q1返回所有列,q2只返回@t1的id列,所以最终呈现的结果集结构和内容就不一样了。
内容的提问来源于stack exchange,提问作者Cellman
相关产品推荐
相关产品推荐

