2017-12-08 31 views
0

私は顧客と顧客の2つのテーブルを持っています。結合基準はCustomerNoとDateです。日付が一致していないか、顧客の住所テーブルで利用できていない場合、私は、顧客の住所で利用できる最新の日付日付が一致しない場合に2つのテーブルに結合

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

ここに解決策があります。私はteradataコンパイラをオンラインで見つけることができないので、私はテストしていません。

基本的に、クエリはサブクエリでMAXレコードを取得し、日付のためのレコードが存在しない場合は、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

一つの方法は、サブクエリです:

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

あなたはこのように、結合条件にCASE式を使用することができますまず第一に:あなたはあなたのELSEロジックは、「利用できる最後のものであることを述べたように

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

このフィールドを何らかの形で、たとえばサブクエリで準備する必要があります。

しかし、最適なソリューションは、この複雑な結合をいくつかのクエリに分割し、それらをすべて結合することです。 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このクエリを試してみてください。

関連する問題