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())
Die beiden Abfragen unterschiedliche Semantik haben, und hat eine höhere Priorität als oder. –
Lesen über [Vorrang Operatoren] (https://msdn.microsoft.com/en-us/library/ms190276.aspx) Beide SQL-Abfragen hat nicht die gleiche Bedingung. – danihp
Der erste ist sowieso schlecht. Weil 'where x = y oder (x = y und z = 1)' dasselbe tut wie 'where x = y' – LukStorms