我在查詢中的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
第一個查詢將返回帶有evt_code LIKE'416%A'的所有行,而不管spt_code。第二個使用AND運算符,所以這些行也必須有一個指定的spt_code值。 –
這與您的WHERE條款的評估順序有關,特別是當第二個查詢使用影響評估順序的括號時。因此,在您的第一個查詢中,您發現結果集的事件代碼爲「416%A」,但未通過揚聲器類型進行過濾? –
設置[壞習慣踢 - 把NOLOCK無處不在](http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/) - 它是*不推薦*到處使用 - 完全相反! –