2010-07-29 4 views
1

사례 문을 사용하려고하지만 오류가 계속 발생하려고합니다. 문은 다음과 같습니다.THEN 표현식에서 CASE 문 값 사용

select TABLE1.acct, 
     CASE 
      WHEN TABLE1.acct_id in (select acct_id 
            from TABLE2 
           group by acct_id 
            having count(*) = 1) THEN 
      (select name 
       from TABLE3 
       where TABLE1.acct_id = TABLE3.acct_id) 
      ELSE 'All Others' 
     END as Name 
    from TABLE1 

THEN 식의 TABLE1.acct_id를 리터럴 값으로 바꾸면 쿼리가 작동합니다. 쿼리의 WHEN 부분에서 TABLE1.acct_id를 사용하려고하면 결과가 둘 이상의 행이라는 오류가 발생합니다. THEN식이 WHEN 문이 사용하는 단일 값을 무시하는 것처럼 보입니다. 아마도 CASE 문을 올바로 사용하지 않았을 수도 있습니다.

TABLE2에 하나의 항목이있는 계정의 이름을 보려고합니다.

모든 아이디어는 인정 될 것입니다. 저는 SQL에서 새로운 것 같습니다.

+0

,하지만 당신은 이미 매우 정교 ... "UNION 제외).. 키워드는 예상되지 FETCH 유효한 토큰을"- – pascal

+0

* 굵은 글씨의 값 *이 일부 편집에서 사라졌습니다 ... 어쨌든, 굵은 글씨의 값을 바꿀 때 ... 무엇으로? – pascal

+1

'acct_id'가'count (*) = 1 '을 가지는 acct_id에 의해 TABLE2 그룹에서 select acct_id에 있다고 말하는 TABLE1, TABLE2, TABLE3을 연결하는 디자인에 제약이 있는가? 즉, TABLE3의 select count (*) 여기서 acct_id = TABLE3.acct_id'는 1을 반환합니까? – pascal

답변

1

먼저 TABLE1.acct 뒤에 쉼표가 누락되었습니다. 둘째, TABLE1에 acct이라는 별칭을 지정했기 때문에이를 사용해야합니다.

Select acct.acct 
    , Case 
     When acct.acct_id in (Select acct_id 
           From TABLE2 
           Group By acct_id 
           Having Count(*) = 1) 
      Then (Select name 
        From TABLE3 
        Where acct.acct_id = TABLE3.acct_id 
        Fetch First 1 Rows Only) 
     Else 'All Others' 
     End as Name 
From TABLE1 As acct 

다른 사람들처럼 THEN 절을 조정하여 하나의 값만 반환되도록해야합니다. 하위 쿼리에 첫 번째 행 1 개만 가져 오기를 추가하면됩니다.

+0

+1 : 쉼표로 잘 잡습니다. – kbrimington

+1

쉼표가 "결과가 둘 이상의 행"인 근본 원인이라고 생각하지 않습니다. 아마 복사/붙여 넣기의 결과 일 것입니다. – FrustratedWithFormsDesigner

+0

와우, 대단한 답변입니다. 정말 고마워. 실제 쿼리에는 많은 문제가 있기 때문에 문제에 집중하기 위해 쉼표와 테이블 별칭과 같은 구문 오류가 발생했습니다. 나는 DB2에 반대하고 있는데 TOP 1은 나에게 오류를 준다. 다음은 acct_id가 한 번만 표시되므로 두 개 이상의 행을 반환 할 수있는 방법은 무엇입니까? THEN 문이 단일 값을 무시하는 것처럼 보입니다. – YeeHaw

0
select name from TABLE3 where TABLE1.acct_id = TABLE3.acct_id 

당신에게 표 1.에 입력하지 않는 이전 행에 표 2에서 선택된 행에 첨부 행이 표 3에있는 모든 이름을 줄 것이다.

0

하나 이상의 값을 가져야합니다.

당신과 함께 몸을 대체 할 수 ... 행 배수를 반환하는

(select count(name) from TABLE3 where TABLE1.acct_id = TABLE3.acct_id) 

... 좁힐.

결과 집합을 줄이려면 DISTINCT 또는 TOP 1이 필요할 수도 있습니다.

행운을 빈다.

+0

동의하지만, TABLE1.acct_id를 리터럴 값으로 바꾸면 쿼리가 제대로 실행됩니까? – YeeHaw

+0

나는 그렇게 기대한다. 셀렉트 카운트 (이름)를 시험해보고 결과를 조사하여 1보다 큰 카운트를 찾으십시오. – kbrimington

0

나는 여기에서 일어나는 일은 "이름"열에 대한 값이기 때문에 사건이 단일 값을 반환해야한다는 것입니다. 하위 쿼리 (select acct_id from TABLE2 group by acct_id having count(*) = 1)은 하나의 값만 반환하기 때문에 OK입니다. (select name from TABLE3 where TABLE1.acct_id= TABLE3.acct_id)은 데이터에 따라 여러 값을 반환 할 수 있습니다. 문제는 여러 값을 단일 행의 단일 필드로 밀어 넣으려고하는 것입니다.

다음으로 수행해야 할 작업은 어떤 데이터로 인해 여러 행이 (select name from TABLE3 where TABLE1.acct_id= TABLE3.acct_id)에 의해 반환되는지 알아 내고이 쿼리가 한 행만 반환하도록 더 제한 할 수 있는지 확인하는 것입니다. 필요한 경우 ...AND ROWNUM = 1과 같은 것을 시도해 볼 수도 있습니다 (Oracle의 경우 - 다른 DB의 경우 유사한 방식으로 반환되는 행을 제한합니다). 당신은 SQL에 가지 새로운있어

1
Then (Select name 
     From TABLE3 
     Where acct.acct_id = TABLE3.acct_id 
     Fetch First 1 Rows Only) 

가져 오기

는 CASE 문에서 수락하지 않습니다