Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 最小化oracle数据库查询_Java_Sql_Oracle - Fatal编程技术网

Java 最小化oracle数据库查询

Java 最小化oracle数据库查询,java,sql,oracle,Java,Sql,Oracle,我有一个java应用程序,我在其中执行以下查询以获取数据 SELECT prod.product_id, prod.product_name, product.stock, st.status_code, st.status_desc, usr1.user_nameas AS soldby, usr2.user_nameas soldto FROM product prod JOIN status ON

我有一个java应用程序,我在其中执行以下查询以获取数据

SELECT prod.product_id,
       prod.product_name,
       product.stock,
       st.status_code,
       st.status_desc,
       usr1.user_nameas AS soldby,
       usr2.user_nameas soldto
  FROM product prod
  JOIN status ON prod.status_code = st.status_code
  LEFT JOIN user usr1 ON prod.agent_id = usr1.user_id
  LEFT JOIN user usr2 ON prod.buyer_id = usr2.user_id
WHERE condition on dates and PROD.STATUS_CODE IN (<<4 inputs>>)
问题是,如果第一个查询根据日期范围返回太多记录,我需要迭代/循环这些多次2次,以获取最后2个查询的DB记录。是否有人建议/指导我给出一些建议,如何最大限度地减少到DB的往返,以便一次性获取数据

我尝试在产品id上使用和划分稠密等级,但失败了,因为它提供的记录比原始记录多

仅供参考:我正在使用oracle 12C


任何提示都将不胜感激,提前感谢。

谢谢每一位,我终于得到了答案。 下面是我遵循的过程,很抱歉,我没有访问整个模式的权限。我将在一段时间内发布DDL

以下是我最终编写的查询,以满足我的需求

    WITH 

PROD_RPT AS (
    SELECT prod.product_id as prodId,
       prod.product_name,
       product.stock,
       st.status_code,
       st.status_desc,
       usr1.user_nameas AS soldby,
       usr2.user_nameas soldto,
       itm.status_code as itmStatus,
       itm. returned as returned,
       stk.status_code as stkStatus
  FROM product prod
  JOIN items itm ON prod.product_id = itm.product_id
  LEFT JOIN stk stk ON st.item_id = itm.item_id
  JOIN status ON prod.status_code = st.status_code
  LEFT JOIN user usr1 ON prod.agent_id = usr1.user_id
  LEFT JOIN user usr2 ON prod.buyer_id = usr2.user_id
  WHERE condition on dates and PROD.STATUS_CODE IN (<<4 inputs>>)
),

ITM_RPT AS (
  SELECT * FROM (
    select count(*) Over(partition by rpt.prodId, rpt.itmStatus ORDER BY rpt.prodId, rpt.itmStatus) cnt,
    row_number() Over(partition by rpt.prodId, rpt.itmStatus ORDER BY rpt.prodId, rpt.itmStatus) rn,
    rpt.*
    FROM PROD_RPT rpt WHERE rpt.returned = 1
  ) where rn = 1
),
ITM_STK_RPT AS (
  SELECT * FROM (
    select count(*) Over(partition by rpt.prodId, rpt.stkStatus ORDER BY rpt.prodId, rpt.stkStatus) cnt,
    row_number() Over(partition by rpt.prodId, rpt.stkStatus ORDER BY rpt.prodId, rpt.stkStatus) rn,
    rpt.*
    FROM PROD_RPT rpt
  ) where rn = 1
)

SELECT * FROM ITM_RPT
UNION ALL 
SELECT * FROM ITM_STK_RPT

如果有一种功能齐全的数据库编程语言,我们就可以用于这类任务,避免多次往返@WilliamRobertson——我相信这算是好的,更具建设性:您可以通过在PL/SQL过程中编码逻辑来减少往返次数。这可以完成包括获取产品列表在内的全部工作,也可以是为每个产品调用一次以一次性处理两个项目计数任务;DML语句,例如代表您的问题的数据;应如何处理数据的英文非代码说明;以及通过您的流程的样本数据的预期输出。可以通过一次查询或编写PL/SQL过程来执行数据库中的所有步骤,但如果没有更多信息,则很难确定您在做什么。@MT0哪里可以上载我的DDL,是否有网站,请告诉我,以便我可以准备并上载它们。谢谢你的回复。
    WITH 

PROD_RPT AS (
    SELECT prod.product_id as prodId,
       prod.product_name,
       product.stock,
       st.status_code,
       st.status_desc,
       usr1.user_nameas AS soldby,
       usr2.user_nameas soldto,
       itm.status_code as itmStatus,
       itm. returned as returned,
       stk.status_code as stkStatus
  FROM product prod
  JOIN items itm ON prod.product_id = itm.product_id
  LEFT JOIN stk stk ON st.item_id = itm.item_id
  JOIN status ON prod.status_code = st.status_code
  LEFT JOIN user usr1 ON prod.agent_id = usr1.user_id
  LEFT JOIN user usr2 ON prod.buyer_id = usr2.user_id
  WHERE condition on dates and PROD.STATUS_CODE IN (<<4 inputs>>)
),

ITM_RPT AS (
  SELECT * FROM (
    select count(*) Over(partition by rpt.prodId, rpt.itmStatus ORDER BY rpt.prodId, rpt.itmStatus) cnt,
    row_number() Over(partition by rpt.prodId, rpt.itmStatus ORDER BY rpt.prodId, rpt.itmStatus) rn,
    rpt.*
    FROM PROD_RPT rpt WHERE rpt.returned = 1
  ) where rn = 1
),
ITM_STK_RPT AS (
  SELECT * FROM (
    select count(*) Over(partition by rpt.prodId, rpt.stkStatus ORDER BY rpt.prodId, rpt.stkStatus) cnt,
    row_number() Over(partition by rpt.prodId, rpt.stkStatus ORDER BY rpt.prodId, rpt.stkStatus) rn,
    rpt.*
    FROM PROD_RPT rpt
  ) where rn = 1
)

SELECT * FROM ITM_RPT
UNION ALL 
SELECT * FROM ITM_STK_RPT