2016-10-04 2 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)'은 'where x = y'와 동일하기 때문에 – LukStorms

답변

1

차이점은 무엇인지 분명히 생각합니다. 이러한 쿼리는 어떤 식 으로든 비슷하지 않습니다. 마지막하지 않는 반면

첫번째 WHERE 절 마지막 부분 괄호를 사용한다.

이 false를 반환하고, 두 번째는 마지막 자마자 레코드를 반환 또는 true를 반환합니다 첫 번째 제품 = '7U3'즉시 모든 레코드를 반환하지 않습니다 것을 의미합니다.

이 작동하는 방법을 알아 보려면 우선 순위에 the documentation를 참조하십시오.

또한, 다음 시간 당신은 내가 코드 : 두 개의 쿼리가 다른 의미를 가지고 있고,보다 높은 우선 순위를 가지고 또는

+1

네, OP가 텍스트로 제공 했어야하는 열 이름을 타이핑하는 것을 원치 않았습니다. –

+0

@ 톰 브이, 내 멍청한 게시물을 용서해주십시오. StackOverflow에 게시하는 것이 처음입니다. 다음 번에는 일반 텍스트로 코드를 추가 할 것입니다. 그러나 세부적인면에서 나에게 더 많은 것을 보여주기 위해 여전히 관심이 있다면 원래 게시물에 추가됩니다. – topcatdc