问题背景:
今天 Java开发工程师咨询,如下SQL语句COUNT函数值怎么会比表T_1行数、表T_2行数都大? 并说是不是ORACLE 数据库的BUG?
SQL:
select count(*) from t_1, t_2 where t_1.id=t_2.id and t_1.id=1;
其中T_1、T_2表结构如下:
create table t_1
(
id number,
c1_1 varchar2(63),
c2_1 varchar2(63)
);
create table t_2
(
id number,
c1_2 varchar2(63),
c2_2 varchar2(63)
);
问题解决:
1. 应用开发工程师之所以会对这个简单的SQL语句有疑问,我想是因为以下几点:
a). 开发工程师面对的应用 系统数据库表之间基本上都会存在着One-To-One、One-To-Many关系,进而形成思维定势。如果T_1、T_2之间通过id字段形成One-To-One、One-To-Many关联关系,则上面COUNT值确实不会比Many一方表行数大。
b). 开发工程师未从根本上了解SQL,如:SELECT语句的程序逻辑
2. 问题分析:
SQL> select * from t_1;
ID C1_1 C2_1
———- ———- ———-
1 c1_1_r1 c2_1_r1
1 c1_1_r2 c2_1_r2
3 c1_1_r3 c2_1_r3
4 c1_1_r4 c2_1_r4
1 c1_1_r5 c2_1_r5
SQL> select * from t_2;
ID C1_2 C2_2
———- ———- ———-
1 c1_2_r1 c2_2_r1
2 c1_2_r2 c2_2_r2
3 c1_2_r3 c2_2_r3
1 c1_2_r4 c2_2_r4
SQL> select count(*) from t_1, t_2 where t_1.id=t_2.id and t_1.id
COUNT(*)
———-
6
SQL> select * from t_1, t_2 where t_1.id=t_2.id and t_1.id=1;
ID C1_1 C2_1 ID C1_2 C2_2
———- ———- ———- ———- ———- ———-
1 c1_1_r1 c2_1_r1 1 c1_2_r4 c2_2_r4
1 c1_1_r1 c2_1_r1 1 c1_2_r1 c2_2_r1
1 c1_1_r2 c2_1_r2 1 c1_2_r4 c2_2_r4
1 c1_1_r2 c2_1_r2 1 c1_2_r1 c2_2_r1
1 c1_1_r5 c2_1_r5 1 c1_2_r4 c2_2_r4
1 c1_1_r5 c2_1_r5 1 c1_2_r1 c2_2_r1
注:从最后一个SQL可以这么认为,是将满足条件id=1的T_1表中所有记录逐条与T_2中记录进行比较,满足条件则形成一条记录
作者 chhuma专栏