2016-10-04 6 views
0

Wir haben einen PeopleSoft-Bericht, der jahrelang ohne Probleme läuft, bis er vor kurzem zu fehlerhaften Ergebnissen führte. Um das Problem zu beheben, mussten wir die WHERE-Klauselparameter gruppieren. Bitte werfen Sie einen Blick auf den folgenden Screenshot: Query Window ScreenshotTSQL-Ergebnisfehler

Die Abfrage sollte unter Berücksichtigung der Parameter keine Daten abrufen. Die Abfrage oben ist die geänderte Abfrage, und die Abfrage unten ist der Bericht, den der Bericht seit über 5 Jahren fehlerfrei ausführt. Jetzt muss ich den Geschäftsvertretern erklären, warum es sich so verhält. Irgendwelche Gedanken?

-- THIS QUERY EXECUTES FINE AND DISPLAYS EXPECTED RESULT (TOP PANE) 
SELECT PRODUCT, HM_RETIRE_FLAG, RETIREMENT_DT 
FROM FSPROD..PS_HM_PRODUCT_AM 
WHERE PRODUCT = '7U3' 
    AND (HM_RETIRE_FLAG = 'Y' OR (HM_RETIRE_FLAG = 'Y' AND RETIREMENT_DT > getdate())) 

-- THIS QUERY DISPLAYS A COMPLETELY DIFFERENT RESULT (BOTTOM PANE) 
SELECT PRODUCT, HM_RETIRE_FLAG, RETIREMENT_DT 
FROM FSPROD..PS_HM_PRODUCT_AM 
WHERE PRODUCT = '7U3' 
    AND HM_RETIRE_FLAG = 'Y' OR (HM_RETIRE_FLAG = 'Y' AND RETIREMENT_DT > getdate()) 
+1

Die beiden Abfragen unterschiedliche Semantik haben, und hat eine höhere Priorität als oder. –

+1

Lesen über [Vorrang Operatoren] (https://msdn.microsoft.com/en-us/library/ms190276.aspx) Beide SQL-Abfragen hat nicht die gleiche Bedingung. – danihp

+1

Der erste ist sowieso schlecht. Weil 'where x = y oder (x = y und z = 1)' dasselbe tut wie 'where x = y' – LukStorms

Antwort

1

Ich denke, es ist ziemlich offensichtlich, was der Unterschied ist. Diese Abfragen sind in keiner Weise ähnlich.

Die erste verwendet Klammern für den letzten Teil der WHERE-Klausel, während die letzte nicht.

Dies bedeutet, dass der erste keine Datensätze zurückgibt, sobald das Produkt = '7U3' false zurückgibt und der zweite Datensatz zurückgibt, sobald der letzte oder true zurückgegeben wird.

Siehe the documentation auf Vorrang, um zu lernen, wie dies funktioniert.

Auch, wenn das nächste Mal posten Sie Ihre Abfragen als Text anstelle von Screenshots würde ich die Mühe gemacht haben, es in Ihrem Code darauf hin :)

+1

Ja, ich wollte nicht die Spaltennamen eingeben, die der OP auch als Text hätte liefern sollen. –

+0

@Tom V, entschuldige meine noob-ähnlichen Beiträge. Ich bin wirklich neu beim Posten auf StackOverflow. Ich werde die Codes beim nächsten Mal definitiv im Klartext hinzufügen. Aber wenn Sie immer noch interessiert sind, mir mehr Details zu zeigen, werden sie im ursprünglichen Beitrag hinzugefügt. – topcatdc