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