Ich habe ein Problem mit der Where-Klausel in einer Abfrage. Warum gibt die erste Abfrage ein anderes Ergebnis als die zweite Abfrage?Änderung der SQL-Where-Klausel führt zu unerwarteten Ergebnissen
Die erste Frage ist:
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
Die zweite Frage ist:
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
Die erste Abfrage gibt alle Zeilen mit evt_code LIKE '416% A' unabhängig von spt_code zurück. Der zweite Operator und der Operator "AND", also müssen diese Zeilen auch einen der angegebenen spt_code-Werte haben. –
Es hängt mit der Reihenfolge der Auswertung Ihrer 'WHERE'-Klausel zusammen, insbesondere da die zweite Abfrage Klammern verwendet, die sich auf die Auswertungsreihenfolge auswirken. In der ersten Abfrage finden Sie also, dass das Resultset den Ereigniscode '416% A' hat, aber nicht nach Sprecherart gefiltert ist. –
Set [Schlechte Angewohnheiten, NOLOCK überall hinzuschieben] (http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/) - es ist * nicht empfehlenswert *, dies überall zu benutzen - im Gegenteil! –