2009-09-17 1 views
0

(그래, 멋진!) :은 선택보기에서 - 예상치 못한 부작용이 내가 응용 프로그램에 포함 이상한 쿼리 건너 한

SELECT PersonId 
    , Salutation 
    , Email 
    , Postcode 
FROM vw_NewsletterSubscriptions 
WHERE PersonId IN (SELECT PersonId FROM vw_NewsletterSubscriptions) 
    AND NewsletterTypeID=1 
    AND UnSubscribeDate Is NULL 
GROUP BY PersonId 
    , Salutation 
    , Email 
    , Postcode 

그것은 나에게있어 WHERE 절에 SELECT를합니다. "데이터가보기에있는이 뷰에서 일부 데이터를 선택하십시오."라는 메시지가 표시되는데 이는 약간 불필요합니다. 그래서 WHERE 절에 해당 줄에서 주석 :

SELECT PersonId 
    , Salutation 
    , Email 
    , Postcode 
FROM vw_NewsletterSubscriptions 
WHERE NewsletterTypeID=1 
    AND UnSubscribeDate Is NULL 
GROUP BY PersonId 
    , Salutation 
    , Email 
    , Postcode 

완성도를 들어 나는 그들이 동일하며, 그렇지 않은 확인하기 위해 두 버전을 달렸다. 새 버전에서는 첫 번째 버전이 아닌 행이 더 많이 반환됩니다. 차이점을보기 위해 바깥 쪽을 두 세트에 합류 시켰지만 추가 행에 대해서는 분명히 다른 점은 없습니다.

나는 분명히 뭔가를 여기에서 놓치고있다. 무슨 일인지 설명해 주시겠습니까?

답변

0

덕분에이 조건을 추가 할 수 있습니다. 필자는 질의 결과를 불필요한 조항과 비교해 보았습니다. 필자는 패턴을 볼 수 있다면 저주를합니다. 보기가 너무 복잡한 난장판 이었기 때문에 나는 그것을 리팩토링했고 이제는 같은 수의 줄을 어느쪽으로 든 가져 왔습니다.게다가 뉴스 레터 구독자 수도 늘어났습니다!

2

PersonID에 NULL이있는 행이 있습니까? 첫 번째 쿼리에는 IN 절이 필터링되지만 두 번째 쿼리에는 INCLUDE로 필터링되지 않으므로 두 번째 쿼리에서 더 많은 행을 반환하는 것으로 설명됩니다.

하나의 행과 둘 다에 나타나는 행의 샘플 - 일부 샘플 데이터 (이름과 다른 식별 데이터가 무고한 것으로 추정 됨)를 게시 할 수 있다면 도움이 될 수 있습니다. 널 (NULL)이 (데이비드 Spillett가 제안), 다음 최선의 전략은 행이있는 에서 자세히보고 시작하는 것입니다 문제가없는 경우

+0

안녕하세요 David, 보기에 null PersonID가 없습니다. 뷰에 두 번 발생하는 14 개의 PersonID가 있지만 WHERE 절을 제거하면 약 600 개의 추가 행이 있습니다. 나는 약간의 괴물처럼보기 자체에 대한 데이터와 쿼리를 얻지 못한다. 보기의 내용이 꽤 안정적이라는 사실은 아마 가치가 있습니다. 그것은 단지 지금 evry가 발생하는 뉴스 레터를 구독하거나 탈퇴 한 사람들을 기반으로합니다. –

0

(또한,이 질문에 유래에 더 적합 할 수 있음) 하나가 아닌 다른 하나에 포함되어 있고, 당신이 그들에 대해 다른 것을 알아낼 수 있는지보십시오.

그다지 도움이되지 않는다면 기본보기의 정의를 파고 들어가서 그 단서가 있는지 확인해야합니다. 뷰에는 복잡한 조인, 필터, UNIONS, 트리거 및 기타 방해 요소가 포함될 수 있습니다.

보기가 간단하다면 기본 테이블을 참조하는이 쿼리를 구성 해보십시오. 동일한 기발한 동작이 발생하는지 확인하십시오.

0

나는 이것이 ms SQL 서버라고 가정하고있다. (나는 SQL-server 태그를 볼 수있다.) 그러나 그렇지 않다면 명확히한다. 나는 이것을 데이터베이스에 삽입 된 750 개의 가짜 행으로 테스트했습니다. 내 데이터가 좋았습니다 (null이 아니어야 함). 문제를 재현 할 수 없었습니다. 나는 그것이 어떤 종류의 데이터 문제라고 가정해야한다. 어떻게 데이터를 보지 않고 문제를 해결할 수 있는지는 모르겠다. 한 가지 방법은보기에서 일반 테이블 (참조 된 필드 만)으로 데이터를 덤프하는 것입니다. 질의가 일반 테이블에 대해 실패했는지 확인하는 것은 흥미로울 것입니다. 또한 참조 된 필드가 5 개 또는 6 개로 제한되면 무언가 뛰어 날 수도 있습니다.

0
PersonId IN (SELECT PersonId FROM vw_NewsletterSubscriptions) 

PersonId IS NOT NULL 

을 의미 -don

당신은 모든 아이디어를 쿼리에 사람을

관련 문제