Oracle11g Oracle中的限定子句

Oracle11g Oracle中的限定子句,oracle11g,teradata,Oracle11g,Teradata,我正在从事Teradata到Oracle的迁移项目。如何修改以下使用Teradata中Qualife的查询 //问题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 TerminationDat

我正在从事Teradata到Oracle的迁移项目。如何修改以下使用Teradata中Qualife的查询

//问题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;
为此,尝试使用have代替qualify,但出现错误:

ORA-00904:MAX_SO_DTM:无效标识符 90400000-%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) 
我知道我必须使用别名dt作为outer WHERE,而不是SP和QSRP,但这里MAX_SO_DTM与来自两个不同表的SO_DTM进行比较。有没有其他的方法来修改这个


谢谢

限定和重用别名都是Teradata特有的

您尝试使用have失败,因为这是处理查询的逻辑顺序:

FROM
WHERE
GROUP BY
HAVING
OLAP-function
QUALIFY -- Teradata specific
SAMPLE or EXPAND ON  -- both are Teradata specific
ORDER
要解决此问题,必须使用派生表/内联视图,并将限定条件移动到外部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;
当您想要重用别名时,必须使用相同的技术

编辑: 第二个查询可以重写为:

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\u DTM=MAX\u SO\u DTM和QSRP.SO\u DTM=MAX\u SO\u DTM*,因为当表在*SP.SO\u DTM=QSRP.SO\u DTM*上连接时,第二个是多余的

否则,您必须使用不同的别名(例如QSRP\U SO\U DTM)将QSRP.SO\U DTM添加到派生表中。在外层,没有更多的SP/QSRP,只有dt,因此:

WHERE (SO_DTM=MAX_SO_DTM AND QSRP_SO_DTM = MAX_SO_DTM)

限定和重用别名都是Teradata特有的

您尝试使用have失败,因为这是处理查询的逻辑顺序:

FROM
WHERE
GROUP BY
HAVING
OLAP-function
QUALIFY -- Teradata specific
SAMPLE or EXPAND ON  -- both are Teradata specific
ORDER
要解决此问题,必须使用派生表/内联视图,并将限定条件移动到外部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;
当您想要重用别名时,必须使用相同的技术

编辑: 第二个查询可以重写为:

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\u DTM=MAX\u SO\u DTM和QSRP.SO\u DTM=MAX\u SO\u DTM*,因为当表在*SP.SO\u DTM=QSRP.SO\u DTM*上连接时,第二个是多余的

否则,您必须使用不同的别名(例如QSRP\U SO\U DTM)将QSRP.SO\U DTM添加到派生表中。在外层,没有更多的SP/QSRP,只有dt,因此:

WHERE (SO_DTM=MAX_SO_DTM AND QSRP_SO_DTM = MAX_SO_DTM)

太好了,非常感谢!嗨,多斯,我用同样的技术尝试了第二个查询。我得到了一个类似ORA-00904:QSRP的错误。所以\u DTM:无效标识符00904。00000-%s:无效标识符。查询:从SELECT列名中选择*,按SP.ID划分的MAXSP.SO\U DTM,从VOPR\U RMSY SP中选择SP.TAX\U ID作为MAX\U SO\U DTM,VOPR\U RMSY\U SPNS QSRP WHERE子句按第1条分组,其中SP.SO\U DTM=MAX\U SO\U DTM和QSRP.SO\U DTM=MAX\U SO\U DTM。在外部where子句中使用表别名有什么问题吗?在外部查询中没有更多的SP/QSRP,所以应该是在so_DTM=MAX_so_DTM和so_DTM=MAX_so_DTM的位置。是的,我猜到了,所以对where so_DTM=MAX_so_DTM进行了修改并尝试,但以ORA-00918:定义不明确的列00918结尾。00000-列定义不明确。内部select工作正常,仅面对外部select的问题。这是否嵌套在另一个查询中?尝试使用限定名称,其中dt.SO\u DTM=dt.MAX\u SO\u DTMPerfect,非常感谢!嗨,多斯,我用同样的技术尝试了第二个查询。我得到了一个类似ORA-00904:QSRP的错误。所以\u DTM:无效标识符00904。00000-%s:无效标识符。查询:从SELECT列名中选择*,按SP.ID划分的MAXSP.SO\U DTM,从VOPR\U RMSY SP中选择SP.TAX\U ID作为MAX\U SO\U DTM,VOPR\U RMSY\U SPNS QSRP WHERE子句按第1条分组,其中SP.SO\U DTM=MAX\U SO\U DTM和QSRP.SO\U DTM=MAX\U SO\U DTM。在外部where子句中使用表别名有什么问题吗?在外部查询中没有更多的SP/QSRP,所以应该是在so_DTM=MAX_so_DTM和so_DTM=MAX_so_DTM的位置。是的,我猜到了,所以对where so_DTM=MAX_so_DTM进行了修改并尝试,但以ORA-00918:定义不明确的列00918结尾。00000-列定义不明确。内部select工作正常,仅面对外部select的问题。这是否嵌套在另一个查询中?尝试使用限定名称,其中dt.SO\u DTM=dt.MAX\u SO\u DTM