2013-03-22 3 views
0

다음은 내가 가지고있는 것입니다.계층 적 규칙 집합을 기반으로 복잡한 SQL 선택을 수행하는 방법은 무엇입니까?

T1은 복잡한 SQL의 ID와 합계를 많이 선택합니다. TA, PF 및 BL은 서로 다른 주소 정보를 보유하는 3 가지 테이블입니다.

TA는 T1.ID.있는 행의 존재를 확인하기 위해 1 차 주소 테이블 : T1의 각 ID에 대한 올바른 주소를 얻기 위하여

는 3 개 계층 일련의 규칙을 따라가 TA에 행이 있으면 주소를 가져 와서 점검 테이블 PF 및 BL을 무시하십시오.

PF는 T1.ID가있는 TA로부터 아무것도 반환하지 않았는지 확인하는 두 번째 주소 테이블입니다. PF에 행이 있으면 주소를 가져 와서 확인 테이블 BL을 무시하십시오.

BL은 T1.ID가있는 PF에서 아무 것도 반환하지 않는지 확인하는 세 번째 주소 테이블입니다. BL에 행이 있으면 주소를 가져옵니다.

지금은 다음과 같은 코드가 있으며 UNION을 사용하지 않고도 별도로 오랫동안 실행됩니다! 이 논리를 효율적으로 작성할 수있는 방법은 무엇입니까? 도와주세요!

select T1.ID, TA.ADDRESS,T1.TOTALS 
from T1, TA 
where T1.ID = TA.ID and TA.ADDRESS like "1" 

UNION 

select T1.ID, PF.ADDRESS,T1.TOTALS 
from T1, PF 
where T1.ID = PF.ID and PF.ADDRESS like "2" 
and not exists(select 1 
       from TA 
       where TA.ID = T1.ID 
       and TA.ADDRESS like "1") 
UNION 

select T1.ID, BL.ADDRESS, T1.TOTALS 
from T1, BL 
where T1.ID = BL.ID and BL.ADDRESS like "3" 
and not exists(select 1 
       from TA 
       where TA.ID = T1.ID 
       and TA.ADDRESS like "1") 
and not exists(select 1 
       from PF 
       where PF.ID = T1.ID 
       and PF.ADDRESS like "2") 
+2

안녕하세요 @tweetybird. 내가 귀하의 게시물을 형식화 한 것을 알게되었을 것입니다. Stack Overflow의 요지는 코드를 코드로 나타나게하려면 앞에 4 칸 이상을 놓으십시오. 당신의 서술에서 "if"라는 단어를 얼마나 자주 보았는지 알면 SQL 함수 coalesce()에 익숙합니까? 대부분의 데이터베이스가이를 지원합니다. 당신의 힘은 알 수 없기 때문에 말할 수는 없지만 (힌트 힌트) –

답변

0

우선 ADDRESS like "1"ADDRESS = "1"으로 변경하십시오. 이 경우 DB 엔진은 ADDRESS (있는 경우)에 인덱스를 사용할 수 있습니다. 당신이 경우에

둘째는, 당신은 not exist 제거 할 수이 :

select T1.ID, TA.ADDRESS,T1.TOTALS, TA.ADDRESS 
from T1, TA 
where T1.ID = TA.ID and TA.ADDRESS like "1" 

UNION 

select T1.ID, PF.ADDRESS,T1.TOTALS, PF.ADDRESS 
from T1, PF 
where T1.ID = PF.ID and PF.ADDRESS like "2" 

UNION 

select T1.ID, BL.ADDRESS, T1.TOTALS, BL.ADDRESS 
from T1, BL 
where T1.ID = BL.ID and BL.ADDRESS like "3" 

ORDER BY 4 

당신은 내가 선택한 열 목록에 ADDRESS 포함이 열을 기준으로 주문한 위의 쿼리에서 볼 수 있듯이. 쿼리에서 not exist을 삭제했습니다. 즉, 우선 순위 수준에 따라 모든 주소가 선택됩니다.

이제 두 가지 옵션을 사용할 수 있습니다. 첫 번째 행만 잡거나 다른 행은 무시하거나 응용 프로그램을 수정할 수없는 경우 두 가지 옵션이 있습니다. 코드를 사용하려면 TOP (SQL Server의 경우), LIMIT (MySql의 경우), ROW_NUM (Oracle의 경우) 기술을 사용하여 첫 번째 n 개의 행을 가져와야합니다. 사용중인 RDBMS에 태그를 지정하지 않으므로 직접 확인하십시오.

+0

감사합니다. @Dan Bracuk. 방금 마감일로 인해 결과가 표시되었지만 나중에 귀하의 방법을 시도 할 것입니다. – tweetybird