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

时间:2022-09-08 11:33:26

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

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部分的其他部分里出现的任何列,包括在处于任何位置出现的函数里的列名参数,都是关键列。