当前位置: 首页 > 面试题库 >

对复杂的联接查询在ORACLE中应用OFFSET和LIMIT?

黄和怡
2023-03-14
问题内容

我正在使用Oracle 11g并且有一个复杂的联接查询。在此查询中,我确实想应用OFFSET并有效地LIMIT使用它Spring BatchFramework

但是事情对我来说不是很清楚。

我的查询

SELECT DEPT.ID rowobjid, DEPT.CREATOR createdby, DEPT.CREATE_DATE createddate, DEPT.UPDATED_BY updatedby, DEPT.LAST_UPDATE_DATE updateddate, 
DEPT.NAME name, DEPT.STATUS status, statusT.DESCR statusdesc, 
REL.ROWID_DEPT1 rowidDEPT1, REL.ROWID_DEPT2 rowidDEPT2, DEPT2.DEPT_FROM_VAL parentcid, DEPT2.NAME parentname 
FROM TEST.DEPT_TABLE DEPT 
LEFT JOIN TEST.STATUS_TABLE statusT ON DEPT.STATUS = statusT.STATUS 
LEFT JOIN TEST.C_REL_DEPT rel ON DEPT.ID=REL.ROWID_DEPT2 
LEFT JOIN TEST.DEPT_TABLE DEPT2 ON REL.ROWID_DEPT1=DEPT2.ID
ORDER BY rowobjid asc;

上面的查询给了我一千万条记录。

注意:这两个html" target="_blank">数据库表都没有PK,因此我需要使用OFFSET和LIMIT。


问题答案:

您可以ROW_NUMBER()在甲骨文的子查询中使用Analytic函数,例如,11g假设需要将行排列在第3到第8之间,以便捕获OFFSET 3LIMIT 8Oracle DB中的逻辑(
实际上,这些子句包含在版本中12c+),只要将结果分组即可由部门的CREATE_DATE命令ID

SELECT q.*
  FROM (SELECT DEPT.ID rowobjid,
               DEPT.CREATOR createdby,
               DEPT.CREATE_DATE createddate,
               DEPT.UPDATED_BY updatedby,
               DEPT.LAST_UPDATE_DATE updateddate,
               DEPT.NAME name,
               DEPT.STATUS status,
               statusT.DESCR statusdesc,
               REL.ROWID_DEPT1 rowidDEPT1,
               REL.ROWID_DEPT2 rowidDEPT2,
               DEPT2.DEPT_FROM_VAL parentcid,
               DEPT2.NAME parentname,
               ROW_NUMBER() OVER (PARTITION BY DEPT.CREATE_DATE ORDER BY DEPT.ID) AS rn
          FROM TEST.DEPT_TABLE DEPT
          LEFT JOIN TEST.STATUS_TABLE statusT
            ON DEPT.STATUS = statusT.STATUS
          LEFT JOIN TEST.C_REL_DEPT rel
            ON DEPT.ID = REL.ROWID_DEPT2
          LEFT JOIN TEST.DEPT_TABLE DEPT2
            ON REL.ROWID_DEPT1 = DEPT2.ID) q
 WHERE rn BETWEEN 3 AND 8;

恰好会返回 6 (8-3 +1)行。如果您需要包括关系(每个创建日期部门标识的值相等),ROW_NUMBER()则应将其替换为另一个窗口函数DENSE_RANK(),因为查询的所有其他部分均保持不变。
这种情况下,将 至少 返回 6 条记录。



 类似资料:
  • 问题内容: 我正在将MS-Access 2003与查询创建者一起使用。我从一个表()中选择所有内容,然后从另一表()中选择一个特定行()。我想从第二个表中选择另一行并将其连接起来。 查询 该查询的确在ID(字段)与where匹配的地方添加了字段。它像一种魅力。但是,我想在结果中添加另一行。我想获得行所在的位置(该部分实际上在工作)和行所在的位置。我将得到2行,并且当我要求()时,我希望将这两行连接

  • 如何将这个复杂的sql语句更改为JPQL? 这是否可以在JPQL表单中显示?

  • 问题内容: 我想我正在解决这个问题,但是遇到了另一个障碍,并且不知道如何解决它 此查询有什么问题- 只需获取通用的“您有一个错误”,它指向联接,但我不知道如何解决它。我想要对customer_address_entity进行联接,因为它具有我需要在其中一条select语句中使用的另一个唯一ID。 问题答案: 首先,您的代码如下所示: 很明显,您在FROM之前有JOIN。 其次,您有一个带有unic

  • 问题内容: 我正在寻找一种在REST API中为搜索查询建模的可靠方法。 在我的api中,您可以使用查询参数在资源的URI中指定搜索条件。 例如: 在服务器端,搜索字符串映射到所需的基础技术。根据其余资源,这可以是一个SQL查询,Hibernate Criteria api,另一个Web服务调用,… 这两个示例很简单,足以支持,但是我还需要更复杂的搜索功能,例如子字符串搜索,日期前后的搜索,NOT

  • 我对Kafka的溪流很陌生。我想执行以下KStream-GlobalKTable纯基于DSL的左联接操作,而不使用map操作。 和另一个输入主题,它是 ,其中value: 我要执行左联接操作是一个流,主数据是一个全局表,以实现结果值为 连接条件为 代码:

  • 问题内容: 我有以下JS对象: 我需要在上述对象上执行此SQL查询: 结果应为: 因为只有该组包含在查询中使用的两个ID。 我找到了有关SQLike和JSLINQ的信息,但是我 在哪里 以及 有 表达式时遇到了问题。是否有可能使用SQL-JS库或JS / jQuery本身(编写函数等)在javascript对象上执行此类查询? 问题答案: Alasql JavaScript SQL库是专门为此类任