嵌套子查询总存在一个等价的连接查询 - 豆丁网
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部分的其他部分里出现的任何列,包括在处于任何位置出现的函数里的列名参数,都是关键列。