2016-09-19 97 views
0

我在查詢中的Where子句有問題。爲什麼第一個查詢給出與第二個查詢不同的結果?SQL Where子句更改導致意外的結果

第一個查詢是:

select distinct 
    [Event Code] = evt_code, 
    [Event Category] = etc_code, 
    [Acronym] = evt_acronym_ext, 
    [Remit To Sort Name] = cst_sort_name_dn, 
    [ReC#] = cst_recno, 
    [Honorarium Amount] = case when fac_honorarium_amount_ext is null then 0.00 else fac_honorarium_amount_ext end, 
    [Speaker type] = spt_code 
from 
    ev_event (nolock) 
inner join 
    ev_event_ext (nolock) on evt_key_ext = evt_key 
inner join 
    ev_event_category (nolock) on etc_key = evt_etc_key and etc_delete_flag = 0 
inner join 
    ev_event_faculty (nolock) on fac_evt_key = evt_key and fac_delete_flag = 0 
inner join 
    ev_event_faculty_ext (nolock) on fac_key_ext = fac_key --and fac_honorarium_amount_ext is not null and fac_honorarium_amount_ext > 0.0 
inner join 
    co_customer (nolock) on cst_key = fac_cst_key and cst_delete_flag = 0 
inner join 
    ev_event_speaker (nolock) on spk_fac_key = fac_key and spk_delete_flag = 0 
inner join 
    ev_event_speaker_type (nolock) on spt_key = spk_spt_key and spt_delete_flag = 0 
where 
    evt_code like '416%A' or evt_code like '516%A' 
    and spt_code in ('Ed Fdn Speaker', 'Ed Fdn Author', 'Ed Fdn Conf Chair') 
order by 
    evt_code 

第二個查詢是:

select distinct 
    [Event Code] = evt_code, 
    [Event Category] = etc_code, 
    [Acronym] = evt_acronym_ext, 
    [Remit To Sort Name] = cst_sort_name_dn, 
    [ReC#] = cst_recno, 
    [Honorarium Amount] = case when fac_honorarium_amount_ext is null then 0.00 else fac_honorarium_amount_ext end, 
    [Speaker type] = spt_code 
from 
    ev_event (nolock) 
inner join 
    ev_event_ext (nolock) on evt_key_ext = evt_key 
inner join 
    ev_event_category (nolock) on etc_key = evt_etc_key and etc_delete_flag = 0 
inner join 
    ev_event_faculty (nolock) on fac_evt_key = evt_key and fac_delete_flag = 0 
inner join 
    ev_event_faculty_ext (nolock) on fac_key_ext = fac_key --and fac_honorarium_amount_ext is not null and fac_honorarium_amount_ext > 0.0 
inner join 
    co_customer (nolock) on cst_key = fac_cst_key and cst_delete_flag = 0 
inner join 
    ev_event_speaker (nolock) on spk_fac_key = fac_key and spk_delete_flag = 0 
inner join 
    ev_event_speaker_type (nolock) on spt_key = spk_spt_key and spt_delete_flag = 0 
where 
    (evt_code like '416%A' 
    and spt_code in ('Ed Fdn Speaker', 'Ed Fdn Author', 'Ed Fdn Conf Chair')) 
    or 
    (evt_code like '516%A' 
    and spt_code in ('Ed Fdn Speaker', 'Ed Fdn Author', 'Ed Fdn Conf Chair')) 
order by 
    evt_code 
+0

第一個查詢將返回帶有evt_code LIKE'416%A'的所有行,而不管spt_code。第二個使用AND運算符,所以這些行也必須有一個指定的spt_code值。 –

+0

這與您的WHERE條款的評估順序有關,特別是當第二個查詢使用影響評估順序的括號時。因此,在您的第一個查詢中,您發現結果集的事件代碼爲「416%A」,但未通過揚聲器類型進行過濾? –

+2

設置[壞習慣踢 - 把NOLOCK無處不在](http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/) - 它是*不推薦*到處使用 - 完全相反! –

回答

1

你的第一個查詢您正在評估 '416%A' 由它的自我。你可以用只有在括號來避免這個...

where (evt_code like '416%A' or evt_code like '516%A') AND 
spt_code in ('Ed Fdn Speaker', 'Ed Fdn Author', 'Ed Fdn Conf Chair') 
0

數據庫被解釋第一where子句如下:

evt_code like '416%A' 
and (spt_code in ('Ed Fdn Speaker', 'Ed Fdn Author', 'Ed Fdn Conf Chair') 
    or evt_code like '516%A') 
    ) 

純英文:如果evt_code就像'416%A',那麼如果spt_code是3項中的任何一項,或者evt_code是516%A,或者兩者都滿足,則滿足where子句。

從技術上講,數據庫添加自己的括號並不準確,但這是一個很好的方式來描繪它。