数据库表连接后获取记录条数之COUNT函数
2012-03-06 19:58
363 查看
问题背景:
今天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中记录进行比较,满足条件则形成一条记录
今天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中记录进行比较,满足条件则形成一条记录
相关文章推荐
- 大数据量下快速获取 SQL Server 数据库表记录数的方法
- 大数据量下快速获取 SQL Server 数据库表记录数的方法
- Android-HttpClient连接网络获取数据
- 根据ajax从服务器获取数据的时间和ID,根据最近的时间,显示一个记录重复ID的数字
- 2.0中获取数据库连接统计数据
- 随机获取Mysql数据表的一条或多条记录
- 随机获取Mysql数据表的一条或多条记录
- 找到数据窗口在查询时,每次查询的记录条数不一致的情况的原因
- mysql查询获取分组后最新的一条记录,策略:先排序,然后在次分组查询(默认第一条),就是最新的一条数据了
- MapReduce直接连接Mysql获取数据 (新API写法)
- 数据库中的记录通过servlet回显到jsp页面中(连接数据库或者查询參照:对数据进行增删改查)
- Python连接impala并获取数据
- sql 按递增查询记录,并获取已排序的数据的百分比
- MapReduce直接连接MySQL获取数据
- SQL分组获取记录的第一条数据——PARTITION BY
- MapReduce直接连接Mysql获取数据
- 获取JDBC中的ResultSet的记录的条数
- JAVA连接Mysql数据库,获取数据
- 3个java类:连接数据库类,获取文件后缀类,从数据库中读入数据生成XML文件