首页 > 数据库 > Oracle >

数据库表连接后获取记录条数之COUNT函数

2012-03-07

问题背景:今天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...

问题背景:
今天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专栏
相关文章
最新文章
热点推荐