Java 最小化oracle数据库查询
我有一个java应用程序,我在其中执行以下查询以获取数据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
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