【问题标题】:Oracle equivalent of a SQL Server queryOracle 等效于 SQL Server 查询
【发布时间】:2014-05-30 03:03:06
【问题描述】:

我需要知道我的 SQL Sever 查询的 Oracle 等效项。有人可以帮帮我吗?

select recno = (select top 1 ld.recno from load ld where ld.crecno = i.recno) 
from inputtable i

【问题讨论】:

    标签: sql-server oracle oracle11g sql-server-2012


    【解决方案1】:

    将 TOP(N) T-SQL 语法转换为 Oracle 兼容 SQL

    您写的SUBQUERY 不是必需的。 LOADINPUTTABLE 表之间的 INNER JOIN 操作是获取所需集合的快速方法。

    SQL 语法解释:LOAD 中的所有记录中,有多少值为CRECNO 的记录在表INPUTTABLE 的列RECNO 中有匹配值?取这些结果,如果结果按...(?)...排序,输出中的第一个值(TOP(1))是什么?

    OP 中没有指定任何SORT 优先级。

    在 SELECT 语句中,始终将 ORDER BY 子句与 TOP 子句一起使用。这是可预测地指示哪些行受 TOP 影响的唯一方法。 Reference From: Microsoft Technet.

    为了说明格式正确且结果可重复的 SQL 语句,我继续并重写了 OP 的 SQL 查询,假设 TOP(n) 解决方案需要 RECNO 列值的 ASCENDING SORT 中的第一个值。

    如果缺少诸如ORDER BY 语句之类的重要表达式,数据库服务器确实具有默认排序和选择行为,但是假设在任何给定环境中所有默认设置都相同是有风险的。

    重写的 SQL:

    WITH sub_query AS (
         SELECT i.recno
           FROM inputtable i, load ld
          WHERE i.recno = ld.crecno
          ORDER BY i.recno ASC
         )
         SELECT s.recno
           FROM sub_query s
          WHERE rownum = 1
    

    可以更改ROWNUM 评估和ORDER BY 标准以获得预期的TOP(n) 行为。

    【讨论】:

      【解决方案2】:

      检查下面的查询

      select (select  ld.recno from load ld where ld.crecno = i.recno AND RowNum =1)
      AS recno  from inputtable i
      

      【讨论】:

      • 你能告诉我执行上述查询后的错误描述吗?
      猜你喜欢
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      • 2011-09-04
      • 2021-10-26
      • 2021-11-18
      • 2014-02-20
      相关资源
      最近更新 更多