2016-09-19 3 views
0

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 
+0

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. –

+0

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. –

+2

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! –

Antwort

1

Ihre erste Abfrage Sie es selbst '416% A' evaluieren. Sie können nur die in Klammern wickeln dies zu vermeiden ...

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

Die Datenbank, die die ersten interpretiert where-Klausel wie folgt:

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') 
    ) 

Im Klartext: wenn evt_code ist wie '416%A', dann ist die where-Klausel ist erfüllt, wenn entweder spt_code in einem der 3 Terme ODER evt_code wie 516% A oder beides ist.

Es ist technisch nicht korrekt zu sagen, dass die Datenbank ihre eigenen Klammern hinzufügt, aber das ist eine gute Möglichkeit, es sich vorzustellen.

Verwandte Themen