2012-11-27 1 views
-1

아래의 쿼리를 찾아서 케이스를 피하고 아래 쿼리를 다시 작성하라고 제안하십시오.더 나은 성능을 위해 DB2 쿼리에서 "케이스"를 피할 수있는 방법이 있습니까?

select A.ID, CASE B.ID IS NOT NULL THEN B.ABID 
      ELSE B.XYID END AS ABXYID 
FROM Table_A A, Table_B B 
WHERE A.PK = B.PK 

더 나은 성능을 위해 위의 쿼리를 다시 작성하십시오.

미리 감사드립니다.

+0

안녕하세요, 왜 여기에 왔는지 다른 방법을 찾지 못했습니다. 그렇지 않으면 내가 왜 여기 와야하지? ? –

+1

정말 성능 문제입니까 아니면 창문 드레싱입니까? 성능 문제는 대개 SQL 쿼리의 조건부 부분을 구조화하는 것과 관련이 있습니다. EXPLAIN을 사용하여 아래의 답변에 제공된 COALESCE 버전과 비교해보십시오. 차이점이 많지 않을 것으로 기대합니다. – NealB

+2

'더 나은 성능을위한 쿼리 작성'.... 이렇게 간단하게 할 수는 없습니다. 최적화 프로그램이 혼란에 빠질 가능성이 많지 않습니다. 너는 적당한 색인을 가지고 있지, 그렇지? –

답변

1

당신이 찾고있는 것은 아니지만 COALESCE 함수는 null이 아닌 첫 번째 인수를 반환합니다. B.ID이 NULL 인 경우 B.ABID도 NULL 인 경우 다음과 같이

는, 당신은 당신의 코드를 다시 작성할 수 :

select A.ID, 
COALESCE(B.ABID, B.XYID) AS ABXYID 
FROM 
Table_A A, 
Table_B B 
Where 
A.PK=B.PK 

아, 그리고 당신이 정말로 적절한 내부 조인 사용해야합니다

select A.ID, 
COALESCE(B.ABID, B.XYID) AS ABXYID 
FROM 
Table_A A 
INNER JOIN Table_B B 
ON A.PK=B.PK 
+0

안녕하세요 .. 시간 내 주셔서 감사합니다 .. .. (B.ID 및 B.XYID가 null이 아니고 B.ABID가 null 인) 조건을 살펴보십시오. .. 그러면 위의 코드는 실패합니다. –

+1

예, 위의 코드는이 경우 원하는 것을 수행하지 않습니다. 이 작업을 수행하기 위해 데이터 또는 테이블 스키마를 변경할 수 없으면 CASE 표현식을 계속 사용해야합니다. – Leons

관련 문제