嵌套子查询总存在一个等价的连接查询?

本文讨论了嵌套子查询是否总能与连接查询等价的问题,通过具体的反例说明在某些情况下,特别是当嵌套子查询包含集合函数并且外部有group by操作时,两者并不等价。例子包括不同group by条件导致的不等价性和表间关联与内层查询的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

嵌套查询总存在一个等价连接查询 - 豆丁网

QUESTION? • Q1: 嵌套子查询总存在一个等价的连接查询如果不对,请举个反例. • Q2:嵌套子查询中可以使用DISTINCT吗? • Q3:嵌套子查询中


Q1: 嵌套子查询总存在一个等价的连接查询如果不对,请举个反例


反例,如下情况:

1、

select * from A t1,(select min(b) b  from A group by c) t2 where t1.b =  t2.b;

等价于

   select *,t2.min(b) b2  from A t1,A  t2 where t1.b =b2   group by t2.c;

【select * from A t1,A  t2 where t1.b =  t2.min(b)group by t2.c;】

 

2、

select * from A t1,(select min(b) b  from A group by c) t2 where t1.b =t2.b  group by d;

不等价于

 select * from A t1,A  t2 group by  d,t2.c having t1.b =t2.min(b)

[select *,t2.min(b) b2  from A t1,A  t2 where t1.b =b2   group by

d,t2.c;]


因为前一句group by c时所得的min(b)的值的集合与后一句group by  d,t2.c时


所得的t2.min(b)的值的集合不一样,这样两句由t1.b =t2.b这个条件筛选出来的


数据行就不一样。

所以,嵌套里有对不在groupby里的列的集合函数,且外层又有group by时就不等价

。嵌套里有group by时就有可能不等价。

 

3、(select min(b) b  from A group by c) t2可以理解为一个表 ,也可以理解为内层。

           多表连接后还是可以理解为一个表的形式

         表连接时,有表间关联列间的比较条件和表内列与数值的比较条件两类

         表的列有关键列和非关键列之分,对于写一个SQL语句来说,关键列是业务逻辑上(即限制条件,如列b〉5)要涉及到的列,所有在含有嵌套查询的语句中最外层上除了select部分的其他部分里出现的任何列,包括在处于任何位置出现的函数里的列名参数,都是关键列。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值