日期:2014-05-17  浏览次数:21016 次

【求教】SQL连接查询与exists查询结果不一样的问题!
test_table表里的需要用到的字段,
acct_id int, user_id int, old_billid int, new_billid int, old_value int, new_value int


我想把这个表里,若有一条记录满足
old_billid != -1 and new_billid = -1 (假设它的old_value=xxx)

且有另外一条记录它的(acct_id,user_id)与上面那条相同,且满足
new_billid != -1 and old_billid = -1 and t1.old_value!=xxx

就进行计数,

下面是两种实现方案:

SQL code

-- 1.用exists:
select count(*) CNT from test_table a
 where a.new_billid=-1 and a.old_billid!=-1
       and exists(select 1 from test_table b
                   where b.acct_id=a.acct_id and b.user_id=a.user_id
                         and b.old_billid=-1 and b.new_billid!=-1
                         and b.new_value!=a.old_value
                 );

-- 2.直接连接查询:
select count(*) CNT
  from test_table a, test_table b
 where a.new_billid=-1 and a.old_billid!=-1
       and a.acct_id=b.acct_id and a.user_id=b.user_id
       and b.old_billid=-1 and b.new_billid!=-1
       and a.old_value!=b.new_value
;




2条查询语句思路应该是一样的,但返回结果不同:
第一个(exists)查询:196347
第二个查询: 445496


麻烦熟练SQL语句的前辈给看下哪里有问题,
是不是我对连接、exists的理解上有问题?

谢谢了!

------解决方案--------------------
1、第一个SQL,只查询a表的数据
2、第二个SQL,如果B表有重复数据,会导致查询数据量比较大
------解决方案--------------------
ID,value
1,a
1,b
2,c
-----
select ID, value from t t1 where exists(
 select 1 from t t2 where t1.id=t2.id

ID,value
1,a
1,b
2,c
-------------
select t1.ID, t1.value,t2.value from t t1, t t2 where t1.id=t2.id

ID,value1,value2
1,a,a
1,a,b
1,b,a
1,b,b
2,c,c

------解决方案--------------------
你这表没主键啊....那情况就复杂了...
比如:
test_table
acct_id user_id old_billid new_billid old_value new_value 
1 2 -1 -1 1 2
1 2 -1 -1 3 4
这样的数据,
用第一个SQL查询,应该是2条
用第二个SQL查询,那就应该是4条了

因为表连接是取2个表的笛卡尔积再根据条件过滤的...
即第二个SQL查询的结果应该是
test_table a, test_table b
a.acct_id a.user_id a.old_value a.new_value b.old_value b.new_value
1 2 1 2 1 2
1 2 1 2 3 4
1 2 3 4 1 2
1 2 3 4 3 4
这样解释不知道清楚不清楚...

我感觉你这个SQL不需要做表关联啊,只需要
select count(*) from test_table a
where a.new_billid=-1 and a.old_billid!=-1
and a.new_value <> a.old_value;
不就行了么?