多表內串連查詢關鍵字不對應時要注意的一個問題,關鍵字應時
作者:iamlaosong
多表串連查詢中最常用的事內串連,內串連中最常用的是等值串連,即在串連條件中使用等號(=)運算子比較被串連列的列值,其查詢結果中列出被串連表中的所有列,包括其中的重複列。例如:
select * from tb_evt_mail_clct a, tb_evt_dlv c
where a.clct_date between to_date('2015-6-11', 'yyyy-mm-dd') and
to_date('2015-6-11', 'yyyy-mm-dd')
and a.mail_num=c.mail_num;
上述查詢中,A表(收寄表)和C表(投遞表)中的郵件號碼mail_num不一定是一一對應的,有可能A表中存在的,C表中不存在,按上面的語句查詢,這些郵件將不會出現,如果需要出現,我們一般在等式的右邊添加一個“(+)”,這樣就可以列出A表中的所有內容,如下所示:
select * from tb_evt_mail_clct a, tb_evt_dlv c
where a.clct_date between to_date('2015-6-11', 'yyyy-mm-dd') and
to_date('2015-6-11', 'yyyy-mm-dd')
and a.mail_num=c.mail_num(+);
如果我們要統計A表中存在C表中不存在的郵件量(未投遞郵件量),可以用下面語句:
select count(*) from tb_evt_mail_clct a, tb_evt_dlv c
where a.clct_date between to_date('2015-6-11', 'yyyy-mm-dd') and
to_date('2015-6-11', 'yyyy-mm-dd')
and a.mail_num=c.mail_num(+)
and c.mail_num is null;
我們可以用下面語句統計妥投郵件量,妥投的條件是c.dlv_sts_code = 'I',即:
select count(*) from tb_evt_mail_clct a, tb_evt_dlv c
where a.clct_date between to_date('2015-6-11', 'yyyy-mm-dd') and
to_date('2015-6-11', 'yyyy-mm-dd')
and a.mail_num=c.mail_num(+)
and c.dlv_sts_code = 'I';
但是如果我們需要統計未妥投郵件量,下面語句是不成立的,統計的結果為0:
select count(*) from tb_evt_mail_clct a, tb_evt_dlv c
where a.clct_date between to_date('2015-6-11', 'yyyy-mm-dd') and
to_date('2015-6-11', 'yyyy-mm-dd')
and a.mail_num=c.mail_num(+)
and c.dlv_sts_code = 'I'
and c.mail_num is null;
這是因為,c.mail_num is null這個條件成立時,c.dlv_sts_code 的值也是null,不可能等於‘I',所以,統計的結果為0,也就是說,
當統計C表mail_num為空白的量時,是不能用其它篩選條件的,確實需要統計的話,需要用下面語句:select count(*) from tb_evt_mail_clct a
where a.clct_date between to_date('2015-6-11', 'yyyy-mm-dd') and
to_date('2015-6-11', 'yyyy-mm-dd')
and not exists (select 1
from tb_evt_dlv c
where c.mail_num = a.mail_num
and c.dlv_sts_code = 'I')