2016-10-04 8 views
0

最近、誤った結果を出すまで何年も問題なくPeopleSoftレポートを実行しています。問題を修正するために、WHERE句のパラメータをグループ化する必要がありました。以下のスクリーンショットをご覧ください。 Query Window ScreenshotTSQLの結果エラー

クエリでは、パラメータを指定してもデータを取得できません。一番上のクエリは変更されたもので、一番下のものはレポートが何のエラーもなく5年間にわたって実行されたものです。今はビジネスの利害関係者にそのような振る舞いがある理由を説明する必要があります。何かご意見は?

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

でそれを指摘するために努力をしていた代わりに、スクリーンショットのテキストとしてクエリを投稿した場合。 –

+1

[precedence opertors](https://msdn.microsoft.com/en-us/library/ms190276.aspx)についての両方のSQLクエリは同じ条件ではありません。 – danihp

+1

最初のものはとにかく悪いです。 'x = yまたは(x = yおよびz = 1)'は 'x = y'の場合と同じになるため、 – LukStorms

答えて

1

私はそれがかなり違っていると思います。これらのクエリは、どのような方法でも同じではありません。

最初のものはwhere句の最後の部分に括弧を使用しますが、最後の部分は括弧を使いません。

これは、product = '7U3'がfalseを返し、すぐにレコードを返さないことを意味し、2番目のレコードは、直近のレコードを返すかtrueを返します。

これがどのように機能するかを知るには、先にthe documentationを参照してください。

また、次回は私はあなたのコード:) 2つのクエリは異なる意味を持っており、より高い優先順位を持っているか、

+1

というように、OPがテキストとして提供する必要がある列名を入力する必要はありません。 –

+0

@Tom V、私のnoobのような記事を赦してください。私はStackOverflowで投稿するのが本当に新しいです。私は間違いなくコードをプレーンテキストで次回追加します。しかし、あなたがまだ詳細を私にもっと見せたいのであれば、元の投稿に追加されます。 – topcatdc

関連する問題