2017-12-08 16 views
0

두 테이블의 고객 및 고객 주소가 있습니다. Join 기준은 CustomerNo 및 Date입니다. 날짜가 일치하지 않거나 고객 주소 테이블에 사용할 수없는 경우, 나는 고객 주소에서 최신 날짜날짜가 일치하지 않을 때 두 테이블 조인

Customer Table    Customer Address Table 
    CustomerNo Date  CustomerNo  Date  Addr 
    123   1/1/2017  123   1/1/2017 sample1 
    123   2/1/2017  123   2/1/2017 sample2 
    123   2/11/2017 
    123   3/1/2017 

예상 출력에 가입 할

  Final Table 

CustomerNo  Date  Addr 
123    1/1/2017 sample1 
123    2/1/2017 sample2 
122    2/11/2017 sample2 
123    3/1/2017 sample2 

때 날짜는 고객 주소에서 사용할 수 없으며 마지막 사용 가능 날짜와 일치합니다.

미리 감사드립니다.

+0

UNION ALL을 (를) 사용해 볼 수도 있습니다. https://stackoverflow.com/a/34194725/8252554에서 그것에 대해 읽어 봅시다. – mtszpater

답변

1

다음은 해결책입니다. 테라 데이타 컴파일러를 온라인으로 찾을 수 없기 때문에 테스트하지 않았습니다.

기본적으로 쿼리는 하위 쿼리에서 MAX 레코드를 가져오고 날짜에 이미있는 레코드가없는 경우 최대 레코드의 Addr을 사용합니다 (COALESCE 참조).

SELECT C.CustomerNo, 
     C.Date, 
     COALESCE(CA.Addr, CMax.Addr) AS Addr 
    FROM Customer C, 
     LEFT JOIN Customer_Address CA 
       ON (C.CustomerNo = CA.CustomerNo AND 
        C.Date = CA.Date) 
     LEFT JOIN (SELECT CustomerNo, Addr, 
         ROW_NUMBER() OVER (PARTITION BY CustomerNo ORDER BY Date Desc) AS r_num 
        FROM Customer_Address 
        GROUP BY CustomerNo) CMax 
       ON (C.CustomerNo = CMax.CustomerNo AND 
        CMax.r_num = 1); 
0

한 가지 방법은 하위 쿼리입니다 : 당신이 CASE 식을 사용할 수있는 모든의

select c.*, 
     (select top 1 address 
     from customeraddress ca 
     where ca.CustomerNo = c.CustomerNo and ca.date <= c.date 
     order by ca.date desc 
     ) as address 
from customer c; 
0

먼저이 같은 조인 조건 :

on c.date = case when ca.date = c.date then ca.date when [some logic] then [some result] end 

당신이 당신의 ELSE 로직 가능 "마지막이라고 언급 한 바와 같이 날짜 "를 지정하려면이 필드를 어떻게 든 서브 쿼리에서 준비해야합니다.

하지만 가장 좋은 해결책은이 복잡한 조인을 몇 개의 쿼리로 분리하여 모두 결합하는 것입니다. Teradata에서 더 빠르게 작동합니다.

-1
SELECT * FROM customer c FULL OUTER JOIN address a ON c.date=A.date WHERE a.date!=NULL 

또는 노력이

SELECT * FROM customer c FULL OUTER JOIN address a ON c.date=A.date 

는 메이크업 주석 .if이 쿼리를 시도합니다.