1

Teradata から Oracle への移行プロジェクトに取り組んでいます。Teradata で QUALIFY を使用している以下のクエリを変更するにはどうすればよいですか。

//クエリ 1

   SELECT S.ID  as Id,
          S.MP_CD as Code,
          S.GM_CD  as GmCode,
          S.GM_MSR_NBR as Mea_Year, 
          S.STTS_CD as YearCode,
          S.TRMNTN_DTM as TerminationDate 
     FROM PD.RVY S, LOAD_LOG TLL 
    WHERE S.UPDTD_LOAD = TLL.LOG_KEY AND TLL.BLSH_CD = 'Y' AND S.STTS_CD IN ( 'C', 'P' ) 
  QUALIFY ROW_NUMBER () OVER (PARTITION BY S.GM_CD ,S.MP_CD ,S.GM_MSR_NBR,S.STTS_CD 
                              ORDER BY S.SO_DTM DESC 
                              ) = 1;

//クエリ 2

  SELECT SP.ID,
         SP.SO_DTM,
         SP.TAX_ID,
         SP.USER_ID,
         SP.FRST_NM,
         SP.LAST_NM,
         SP.PHONE_NBR,
         QSRP.TAX_ID,
         QSRP.ROW_ID,
         MAX(SP.SO_DTM) OVER (PARTITION BY SP.ID, SP.TAX_ID) MAX_SO_DTM       
    FROM VOPR_RMSY SP,VOPR_RMSY_SPNS QSRP
    WHERE  SP.ID =:URVYID AND QSRP.TAX_ID =:RPAXID 
          AND SP.ID = QSRP.ID AND SP.TAX_ID = QSRP.TAX_ID AND SP.SO_DTM = QSRP.SO_DTM 
    QUALIFY (SP.SO_DTM=MAX_SO_DTM AND QSRP.SO_DTM = MAX_SO_DTM) 
    GROUP BY SP.ID,SP.SO_DTM,SP.TAX_ID,SP.USER_ID,SP.FRST_NM,SP.LAST_NM,SP.PHONE_NBR,
            QSRP.TAX_ID,QSRP.ROW_ID;

これについては、資格の代わりに HAVING を試してみましたが、エラーが発生しました:

ORA-00904: "MAX_SO_DTM": 無効な識別子 00904. 00000 - "%s: 無効な識別子"

MAX に使用されるエイリアスがここで機能していないようです....

あなたの助けは本当に感謝しています!

編集:

SELECT * FROM
  (         
 SP.ID,
     SP.SO_DTM,
     SP.TAX_ID,
     SP.USER_ID,
     SP.FRST_NM,
     SP.LAST_NM,
     SP.PHONE_NBR,
     QSRP.TAX_ID,
     QSRP.ROW_ID,
     MAX(SP.SO_DTM) OVER (PARTITION BY SP.ID, SP.TAX_ID) AS MAX_SO_DTM       
FROM VOPR_RMSY SP,VOPR_RMSY_SPNS QSRP 
WHERE  SP.ID =:URVYID AND QSRP.TAX_ID =:RPAXID AND SP.ID = QSRP.ID AND SP.TAX_ID =  
       QSRP.TAX_ID AND SP.SO_DTM = QSRP.SO_DTM 
GROUP BY SP.ID,SP.SO_DTM,SP.TAX_ID,SP.USER_ID,SP.FRST_NM,SP.LAST_NM,SP.PHONE_NBR,
        QSRP.TAX_ID,QSRP.ROW_ID;
 )dt WHERE (SP.SO_DTM=MAX_SO_DTM AND QSRP.SO_DTM = MAX_SO_DTM) 

SP と QSRP の代わりに外側の WHERE にエイリアス dt を使用する必要があることはわかっていますが、ここでは MAX_SO_DTM を 2 つの異なるテーブルの SO_DTM と比較しています。これを変更する他の方法はありますか?

ありがとう!

4

1 に答える 1

5

QUALIFY とエイリアスの再利用は Teradata 固有です。

これはクエリを処理する論理的な順序であるため、HAVING の試行は失敗します。

FROM
WHERE
GROUP BY
HAVING
OLAP-function
QUALIFY -- Teradata specific
SAMPLE or EXPAND ON  -- both are Teradata specific
ORDER

これを解決するには、派生テーブル/インライン ビューを使用し、QUALIFY 条件を外側の WHERE に移動する必要があります。

SELECT *
FROM
 (
   SELECT S.ID  as Id,
          S.MP_CD as Code,
          S.GM_CD  as GmCode,
          S.GM_MSR_NBR as Mea_Year, 
          S.STTS_CD as YearCode,
          S.TRMNTN_DTM as TerminationDate,
          ROW_NUMBER () OVER (PARTITION BY S.GM_CD ,S.MP_CD ,S.GM_MSR_NBR,S.STTS_CD 
                          ORDER BY S.SO_DTM DESC) AS rn 
     FROM PD.RVY S, LOAD_LOG TLL 
    WHERE S.UPDTD_LOAD = TLL.LOG_KEY AND TLL.BLSH_CD = 'Y' AND S.STTS_CD IN ( 'C', 'P' ) 
  ) dt
WHERE rn = 1;

エイリアスを再利用する場合は、同じ手法を使用する必要があります。

編集: 2 番目のクエリは次のように書き換えることができます。

SELECT * 
FROM
 (        
   SELECT 
        SP.ID,
        SP.SO_DTM,
        SP.TAX_ID,
        SP.USER_ID,
        SP.FRST_NM,
        SP.LAST_NM,
        SP.PHONE_NBR,
        QSRP.TAX_ID,
        QSRP.ROW_ID,
        MAX(SP.SO_DTM) OVER (PARTITION BY SP.ID, SP.TAX_ID) AS MAX_SO_DTM       
   FROM VOPR_RMSY SP,VOPR_RMSY_SPNS QSRP 
   WHERE SP.ID =:URVYID 
     AND QSRP.TAX_ID =:RPAXID 
     AND SP.ID = QSRP.ID 
     AND SP.TAX_ID =  QSRP.TAX_ID 
     AND SP.SO_DTM = QSRP.SO_DTM
   GROUP BY SP.ID,SP.SO_DTM,SP.TAX_ID,SP.USER_ID,SP.FRST_NM,SP.LAST_NM,SP.PHONE_NBR,
           QSRP.TAX_ID,QSRP.ROW_ID
 )dt
WHERE SO_DTM=MAX_SO_DTM 

*(SP.SO_DTM=MAX_SO_DTM AND QSRP.SO_DTM = MAX_SO_DTM)* の両方の比較を行う必要はありません。これは、テーブルが *SP.SO_DTM = QSRP.SO_DTM* で結合されているため、2 番目の比較が冗長であるためです。

それ以外の場合は、別のエイリアス (QSRP_SO_DTM など) を使用して派生テーブルに QSRP.SO_DTM を追加する必要がありました。外側のレベルには SP/QSRP はなく、dt だけなので、次のようになります。

WHERE (SO_DTM=MAX_SO_DTM AND QSRP_SO_DTM = MAX_SO_DTM)
于 2013-09-16T06:10:03.003 に答える