You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

结果集连接机制:为何两段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  | 9
    
  • q2的结果:明确指定只返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:42:57