Oracle 中的限定子句

2024-01-12

我正在从事 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 的别名在这里不起作用......

非常感谢您的任何帮助!

EDITED:

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) 

我知道我必须对外部 WHERE 使用别名 dt 而不是 SP 和 QSRP,但这里 MAX_SO_DTM 与来自两个不同表的 SO_DTM 进行比较。还有其他方法可以修改这个吗?

Thanks!


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;

当您想要重用别名时,必须使用相同的技术。

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

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* 上联接的。

否则,您必须使用不同的别名(例如 QSRP_SO_DTM)将 QSRP.SO_DTM 添加到派生表。在外层,不再有 SP/QSRP,只有 dt,所以它是:

WHERE (SO_DTM=MAX_SO_DTM AND QSRP_SO_DTM = MAX_SO_DTM)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle 中的限定子句 的相关文章

  • MyBatis - jdbcTypeForNull Oracle

    我将 MyBatis 与 Oracle 11g R2 数据库结合使用 我正在使用 MyBatis 3 3 和 ojdbc6 12 1 0 2 我的问题是每当我尝试插入一个空对象时我都会得到以下信息 org springframework j
  • Oracle SQL 中的有向图使用递归查询仅访问每个节点一次

    描述 在我们的问题域中 我们正在研究一组连接在一起形成图的边 从给定的节点 或多个节点 开始 我们必须列出整个图中连接到给定节点 或多个节点 的所有链接 我们必须从左到右 从上到下显示这些链接 对于循环数量有限的图 我们有一个针对此问题的有
  • 如何在Oracle中查找模式名称?当您使用只读用户连接到 SQL 会话时

    我使用只读用户连接到 Oracle 数据库 并且在 sql Developer 中设置连接时使用了服务名称 因此我不知道 SID 架构 如何找到我连接到的架构名称 我正在寻找这个 因为我想要生成 ER 图 https stackoverfl
  • 具有两列的 LISTAGG 函数

    我有一张这样的桌子 报告 user id Department Position Record id 1 Science Professor 1001 1 Maths 1002 1 History Teacher 1003 2 Scienc
  • Flyway 在空模式上发现非空模式

    我正在尝试实施数据库迁移Flyway 4 2 0 Oracle 11g 我有这个空架构 当我尝试迁移时 Flyway 说 造成原因 org flywaydb core api FlywayException 发现非空 模式 PASHA 没有
  • IO 错误:网络适配器无法与 Oracle 11gR2 建立连接。与 SQL 开发人员联系

    我已按照 中提到的所有步骤 在 RedHat6 Linux 实例上安装了 Oracle 11ghttp technologylair net 2013 08 oracle 11g installation linux comment 50
  • Oracle 数据脱敏

    我们有一个要求 即使用 Oracle 函数来屏蔽特定的表列 该函数提供持久的屏蔽输出字符串 我们尝试了Oracle Hash Function 但它没有给出String类型的返回值 我们尝试了 Oracle Random 函数 dbms r
  • ORA-01873: 领先精度

    我正在尝试查询视图 但得到 ORA 01873 区间的前导精度太小 错误消息 以下是查询 Select from table order by Col1 下面是视图结构 Col1 NOT NULL NUMBER Col2 NOT NULL
  • 选择和更新之间的竞争条件

    我需要以一种不会默默破坏基于 Web 的应用程序中另一个客户端的更改的方式更新 Oracle 数据库中的行 在我当前的系统中 我执行以下操作 SELECT FROM table WHERE id ID AND lastmodified LA
  • Oracle - 特定用户的审计跟踪

    正如主题所述 我正在寻找一种方法来跟踪特定用户的活动 可能有也可能没有 SYSDBA 或 SYSOPER 权限 例如 人力资源部 我想知道他的登录详细信息是什么 他更改了哪些对象 它们的原始值是什么 执行的 SQL 语句 执行了哪些过程 函
  • 如何将示例 Oracle HR 数据库导入到 SQL Developer 中?

    编辑 我想我现在已经接近解决这个问题了 如果是的话我会自我回答 我已经被这个问题困扰了一段时间 我想使用示例 Oracle Human Resources 数据库 我一直在学习通过这些说明 http docs oracle com cd E
  • 这里不允许使用 oracle 列

    我收到这个错误 Error report ORA 00984 column not allowed here ORA 06512 at line 14 00984 00000 column not allowed here 这是代码 我复制
  • Oracle - 如何使用快速刷新和联接创建物化视图

    所以我很确定 Oracle 支持这一点 所以我不知道我做错了什么 这段代码的工作原理 CREATE MATERIALIZED VIEW MV Test NOLOGGING CACHE BUILD IMMEDIATE REFRESH FAST
  • Teradata:数据透视中的 IN 子句无法从表中获取数据

    我想提取一些Calender Weeks从年度数据来看 完成后 我想旋转它 以便每个都有一行ID 我们有一张桌子DB MY CWs只有一列CW含有Calender Weeks我们感兴趣 以下代码提取相关内容Calender Weeks CR
  • 获取表的某些列只有空值

    我需要知道一张表的哪些列只有空值 我知道我应该在 user tab columns 中执行循环 但是如何仅检测具有空值的列呢 感谢并抱歉我的英语 要在事先不知道列标识的情况下执行查询 需要使用动态 SQL 假设您已经知道该表不为空 您可以执
  • SQL 日期转换结果为“无效的数字格式模型参数”。

    我必须select一些数据来自Oracle 11g数据库 但我似乎不明白为什么以下select查询失败 SELECT INFO ID INFO DETAIL IMPORTANT FLG DELETE FLG CREATE TIME DISP
  • oracle sql if条件然后选择语句1 else选择语句2

    我有参数 prmtr我想要的是根据参数输入使用 select 语句 我试过这个 if prmtr A then select from tblA else select from tblB end if 但这是行不通的 还有其他方法可以做到
  • java.library.path 中没有 ocijdbc12

    我正在尝试使用 OCI 驱动程序通过 java 程序连接到 oracle 以下是配置 Windows 7 32 位 JDK 1 7 Oracle 客户端 11g R2 ojdbc7 jar在我的独立应用程序的类路径中 但我收到以下异常 Ex
  • 将游标中的数据合并为一个

    我有一个存储过程 它多次执行另一个存储过程 我需要联合并返回数据 这是在执行第二个过程后得到的 我可以以某种方式将多个游标中的数据合并到另一个游标中吗 没有临时表或类表数据类型是否可能 编辑 联合的游标计数实际上是 n 其中 n 是 1 2
  • 查询从 Teradata 时间戳返回特定日期(6)

    我如何从 teradata timestamp 6 字段中搜索特定日期 例如 2013 10 22 sel from table A where date 2013 10 22 我尝试了上面的查询 该查询抛出错误 请帮忙 你可以这样尝试 s

随机推荐

  • 暂停 Elastic Beanstalk 应用程序环境?

    我想在升级数据库时关闭应用程序服务器 有没有办法在不终止 破坏环境的情况下暂停或停止应用程序服务器 我是否可以直接访问 Elastic Beanstalk 负载均衡器并暂时进行更改 而不会对 Elastic Beanstalk 配置或其管理
  • 使用 Hibernate Criteria API 性能不佳

    我有一个使用 Hibernate 与 MsSQL 2005 服务器通信的 Java 应用程序 驱动程序是net sourceforge jtds 1 2 4 一切正常 但性能不佳horrible 我怀疑索引未用于传递给它的查询 因为响应时间
  • 将列表序列化为 JSON [重复]

    这个问题在这里已经有答案了 我正在客户端和 Django 服务器之间发送信息 我想使用 JSON 来实现这一点 我正在发送简单的信息 字符串列表 我尝试使用django core serializers 但是当我这样做时 我得到了 Attr
  • 为什么 /proc/$PID/status 中的 CapEff 全为零

    我从 ping 二进制文件中删除了 setuid 位并添加了cap net raw p而是如下 chmod 755 bin ping setcap cap net raw p bin ping 然后我跑了ping在一个终端中并从另一个终端检
  • 更改 tabbaritem 的字体大小

    是否可以更改选项卡的字体大小 我推荐一个更好的方法 yourTabBarItem setTitleTextAttributes NSDictionary dictionaryWithObjectsAndKeys UIColor whiteC
  • 如何在 Lua 解释器中创建新命令

    编辑 我在ubuntu上 所以在lua解释器中你显然可以调用内置函数 例如 gt 函数名 函数参数 我想创建一个新函数 让 lua 解释器在每次输入时都能识别它 有没有一种方法可以将我的函数添加到 lua 解释器中本机识别的函数列表中 这样
  • “fabs”:使用模板时对重载函数的不明确调用

    我有以下功能 T tContainer t
  • python 使用固定数量的数字格式化浮点数

    我想用固定数量的数字来格式化我的浮点数 现在我正在做以下事情 format 6 6g print format 0 00215165 print format 1 23260 print format 145 5655 但这输出 0 002
  • F# 中的泛型和接口

    在 C 中 可以声明泛型参数必须实现某个接口 如下所示 public class Something
  • 将 CSV 导入 Access 的 Java 代码

    我将下面的代码发布到 Sun 开发人员论坛 因为我认为它出现了错误 真正的错误是在该代码被命中之前 我收到的回复之一说它不起作用并把它扔掉 但它实际上正在发挥作用 它可能不是最好的代码 我是 Java 新手 但它是否存在本质上的 错误 CO
  • 将 cx_Freeze 与 scipy 一起使用时出现导入错误

    我正在尝试使用 cx Freeze 从 python 项目生成 app 一般来说 我可以正常工作 但是我的一些依赖于 scipy 的模块在执行时出现导入错误 No module named csr 在构建文件夹下我看到一个文件 scipy
  • 匹配中多个期望语句的自定义断言消息

    我在 Rspec 中编写了一个自定义匹配方法 用于将对象与哈希进行匹配 我想做的是为每一行设置自定义失败消息expect describe cars do car FactoryGirl create car name Alpha desc
  • Apple 现在是否要求所有 iPad 应用程序都支持视网膜屏幕? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我从 Apple 看到了这条新闻 谈论需要为视网膜设备构建新的 iOS 应用程序提交 https developer apple com news i
  • R 无法解析为变量(新的 android 项目)[重复]

    这个问题在这里已经有答案了 新项目也会发生这种情况 gen 文件夹是空的 Activity main xml 文件中没有错误 我努力了 项目 gt 清洁 项目 gt 属性 gt 检查android版本 项目 gt 构建 重新安装eclips
  • 在网络浏览器中,onblur 和 onfocusout 之间有什么区别?

    如果是一样的话 为什么会发生两次这样的事件呢 如您所知 onBlur如果某个元素具有焦点 但失去焦点 则会触发该事件 The 焦点移出时在这种情况下会触发事件 但如果任何子元素失去焦点也会触发 例如 您有一个具有特殊格式的 div 因为人们
  • 将 Intent 过滤器操作传递给 Audible

    我正在尝试从应用程序内打开 Audible 并在启动时开始播放 Audible Audible 启动正常 但无法开始播放 有声清单文件包含
  • Cassandra 中的列排序

    当我在 CQL 中创建表时 是否需要精确确定列的顺序NOT在主键和NOT聚类列 CREATE TABLE user a ascii b ascii c ascii PRIMARY KEY a 它相当于吗 CREATE TABLE user
  • Glide - 向请求添加标头

    有没有一种方法可以在下载图像时添加自定义标头以进行请求 我可以在 Glide 中使用 volley 或 okhttp 我尝试在okhttpclient中的cookiemanager中添加cookie 但没有帮助 Glide 中有调试请求响应
  • ApplicationInsight 导致网站在启动时挂起

    目前有人成功使用 ApplicationInsight 吗 我除了试图让它发挥作用之外什么也没遇到 首先 我遇到了很多问题 VS 拒绝使用 ApplicationInsight 创建新网站以及将 ApplicationInsight 添加到
  • Oracle 中的限定子句

    我正在从事 Teradata 到 Oracle 的迁移项目 我如何修改在 Teradata 中使用 QUALIFY 的以下查询 查询1 SELECT S ID as Id S MP CD as Code S GM CD as GmCode