2017-05-15 11 views
0

처음 포스터 오랜 시간 익명 사용자.예기치 않은 결과를 생성하는 중첩 된 SQL 문

사람들이 속한 수준에 따라 등록 정보를 가져 오려고합니다. 00 수준의 사용자는 두 개의 등록 중 하나에 들어갈 수 있으므로 중첩 된 사례 문을 수행하려고합니다. 성명서에 나와 있듯이, 나는 중첩 된 사례 진술의 두 결과 모두에 나타나고있는 사람들이 꽤있다. 다른 모든 레벨은 정상적으로 작동합니다. 누구나 왜 결과가 when과 else 문 모두에 나타나는지에 대한 아이디어가 있습니까? 아니면 중첩 된 CASE 문 대신이 코드를 작성하는 더 적절한 방법이 있습니까? 화면 = 100을 갖는 기준을 충족 00의 수준을 가진 사람에 대한

CASE 
     WHEN B.Level = '00' 
     THEN  
       CASE 
        WHEN C.SCREEN = '100' and C.FIELD_NUMBER = '65' and C.FIELD_VALUE = 'Y' THEN CONCAT(B.Location, ':', B.Level, ':', 'H') 
        ELSE CONCAT(B.Location, ':', B.Level, ':','A') 
       END 
      WHEN B.Level in ('A', 'B', 'C', 'D', 'E') THEN CONCAT(B.Location, ':', 'A-E') 
      WHEN B.Level in ('F', 'G', 'H') THEN CONCAT(B.Location, ':', 'F-H') 
      WHEN B.Level = 'I' THEN CONCAT(B.Location, ':', 'I') 
      WHEN B.Level = 'J' THEN CONCAT(B.Location, ':', 'J') 
      WHEN B.Level = 'K' THEN CONCAT(B.Location, ':', 'K') 
      ELSE CONCAT(':', B.Location, B.Level) 
END AS Registration, 

현재 결과, Field_Number = 65 필드 _value = Y가 같은 중복이 발생할 것이다 :

  • 사람 X있는 Location1 : 레벨 1 : H
  • 인 X있는 Location1 : 레벨 1하십시오

인 X가 기준이 그 때 보여주는 두번째 결과를 안거나 적어도 즉 것을 충족하면 내가 갈 결과.

+0

조인과 관련하여 "사람"당 하나의 값을 다시 가져 오는 것입니까? – JohnHC

+5

질문을 편집하고 샘플 데이터와 원하는 결과를 제공하십시오. 'case' 표현식에서 정확히 하나의'then' 절이 리턴됩니다. –

답변

0

case에 아무런 문제가 없으며 문제는 join입니다. 그것은 옳거나 그름으로 복제 된 사람당 하나 이상의 가치 집합을 반환합니다. 당신은 많은 예제를 통해 당신의 case 표현의 효능을 테스트하려면

, 당신은 아래에 시도 할 수 있습니다 :

-- Set up some test data: 
declare @t table ([Level] nvarchar(10),Screen nvarchar(10), Field_Number nvarchar(10), Field_Value nvarchar(10), [Location] nvarchar(10)); 
insert into @t values('00','100','65','Y','Location1'); 

-- Generate 10 rows of the same values: 
with t as 
(
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t 
), tt as 
( -- And then join them together 6 times to get 1 million rows (10^6): 
    select t1.* from t t1, t t2, t t3, t t4, t t5, t t6 
) 
select CASE 
     WHEN B.Level = '00' 
     THEN  
       CASE 
        WHEN b.SCREEN = '100' and b.FIELD_NUMBER = '65' and b.FIELD_VALUE = 'Y' THEN CONCAT(B.Location, ':', B.Level, ':', 'H') 
        ELSE CONCAT(B.Location, ':', B.Level, ':','A') 
       END 
      WHEN B.Level in ('A', 'B', 'C', 'D', 'E') THEN CONCAT(B.Location, ':', 'A-E') 
      WHEN B.Level in ('F', 'G', 'H') THEN CONCAT(B.Location, ':', 'F-H') 
      WHEN B.Level = 'I' THEN CONCAT(B.Location, ':', 'I') 
      WHEN B.Level = 'J' THEN CONCAT(B.Location, ':', 'J') 
      WHEN B.Level = 'K' THEN CONCAT(B.Location, ':', 'K') 
      ELSE CONCAT(':', B.Location, B.Level) 
     END AS Registration 
    ,count(*) as c 
from tt b 
group by CASE 
     WHEN B.Level = '00' 
     THEN  
       CASE 
        WHEN b.SCREEN = '100' and b.FIELD_NUMBER = '65' and b.FIELD_VALUE = 'Y' THEN CONCAT(B.Location, ':', B.Level, ':', 'H') 
        ELSE CONCAT(B.Location, ':', B.Level, ':','A') 
       END 
      WHEN B.Level in ('A', 'B', 'C', 'D', 'E') THEN CONCAT(B.Location, ':', 'A-E') 
      WHEN B.Level in ('F', 'G', 'H') THEN CONCAT(B.Location, ':', 'F-H') 
      WHEN B.Level = 'I' THEN CONCAT(B.Location, ':', 'I') 
      WHEN B.Level = 'J' THEN CONCAT(B.Location, ':', 'J') 
      WHEN B.Level = 'K' THEN CONCAT(B.Location, ':', 'K') 
      ELSE CONCAT(':', B.Location, B.Level) 
    END 

을이 문장의 출력은 정확히 동일 백만 Registration 값입니다 : Location1:00:H. 정말로 원한다면이 스크립트는 원하는만큼의 값을 반환 할 수 있으며 Registration은 변경되지 않습니다. 이 문제를 해결하려면


, Person X 필터링, 당신의 BC 테이블 사이 바로 join (I 희망 이러한 설명 별칭뿐 아니라 A, B, C, D 등인가?)에 select을 볼 반환되는 것. 나는 당신이 다른 데이터의 조합을 볼 것이라고 100 % 확신합니다.

+0

그건 의미가 있습니다. 나는 사건에 너무 집중했고 조인에 대해서 생각조차하지 않았다. 도와 줘서 고마워. – Seth

+0

그게 내가 필요로하는 대답이었습니다. 내가 새로운 사람들이기 때문에 카운터를 늘리지는 않습니다. 다시 한번 감사드립니다. – Seth