繁体   English   中英

Oracle SQL请求-SELECT中的SELECT具有MAX值

[英]Oracle SQL Request - SELECT in SELECT with MAX value

您能帮我根据历史记录表创建视图吗?

上下文:完成更新(到日期t)时,将在相关表中创建新行(新ID HIST)。

这里是我数据库的结构:

在此处输入图片说明

两个表中的ID HIST不同,并且没有链接。 仅ID合同已链接。

我希望该视图从按日期排序的两个表中检索所有数据(由于ID_HIST和创建日期)。 如果更新涉及模块表,则必须重新获取合同上与最后更新相对应的所有最后值),例如:

在此处输入图片说明

我正在尝试执行此操作,但是我很难实现用于获取模块更新的部件,该模块已加入到合同的最后更新(合同的最后一行,其中合同日期<模块日期)。

这里使用的查询

--- Results List from the contract list
SELECT 
  CONTRACT_HIST_ID HIST_ID,
  CONTRACT_HIST_DT_CRE,
  CONTRACT_ID,
  CONTRACT_TITLE,
  CONTRACT_DESC,
  CONTRACT_BUDGET

from CONTRACT_HIST CT

UNION

--- Results List from the modules list
SELECT 
  DISTINCT(MD.MOD_HIST_ID) HIST_ID,
  MD.MODULE_HIST_DT_CRE,
  CT.CONTRACT_HIST_ID,
  CT.CONTRACT_TITLE,
  CT.CONTRACT_DESC,
  CT.CONTRACT_BUDGET

FROM MODULE_HIST MD
JOIN  
(SELECT CT.CONTRACT_HIST_ID,
  CT.CONTRACT_HIST_ID,
  CT.CONTRACT_TITLE,
  CT.CONTRACT_DESC,
  CT.CONTRACT_BUDGET
  FROM CONTRACT_HIST CT      
  WHERE CT.CONTRACT_HIST_ID in 
  (SELECT MAX(CONT.CONTRACT_HIST_ID) 
      FROM CONTRACT_HIST CONT
      JOIN MODULE_HIST MD
      ON CONT.CONTRACT_HIST_ID=MD.MOD_HIST_CONTRACT_ID
      AND CONT.CONTRACT_HIST_DT_CRE < MD.MODULE_HIST_DT_CRE      
  )  
)CT
ON CT.CONTRACT_ID=MD.MOD_HIST_CONTRACT_ID

我建议您的数据模型需要改进。 当您将数据放入数据库时​​,您需要考虑如何最终将其取回。 在这种情况下,应该在“合同历史记录”和“模块历史记录”表中都插入“合同版本号”,以便可以直接内部联接数据。

但是,按原样给出数据模型,请尝试以下操作:

--- Results List from the contract list
SELECT contract_hist_id hist_id,
       contract_hist_dt_cre,
       contract_id,
       contract_title,
       contract_desc,
       contract_budget
FROM   contract_hist ct
UNION
--- Results List from the modules list
SELECT md.mod_hist_id,
       md.module_hist_dt_cre,
       MAX (ct.contract_hist_id) KEEP (DENSE_RANK LAST ORDER BY cont.contract_hist_dt_cre) contract_hist_id,
       MAX (ct.contract_title) KEEP (DENSE_RANK LAST ORDER BY cont.contract_hist_dt_cte) contract_title,
       MAX (ct.contract_desc) KEEP (DENSE_RANK LAST ORDER BY cont.contract_hist_dt_cte) contract_desc,
       MAX (ct.contract_budget) KEEP (DENSE_RANK LAST ORDER BY cont.contract_hist_dt_cte) contract_budget
FROM   module_hist md
       INNER JOIN contract_hist cont
         ON cont.contract_hist_id = md.mod_his_contract_id
         AND cont.contract_hist_dt_cre < md.module_hist_dt_cre
GROUP BY md.mod_hist_id, md.module_hist_dt_cre;

我通过更新查询来解决我的问题:

SELECT 
  CONTRACT_HIST_ID HIST_ID,
  CONTRACT_HIST_DT_CRE,
  CONTRACT_ID,
  CONTRACT_TITLE,
  CONTRACT_DESC,
  CONTRACT_BUDGET
FROM CONTRACT_HIST CT

UNION

SELECT DISTINCT(MD.MOD_HIST_ID) HIST_ID,
  MD.MODULE_HIST_DT_CRE,
  MD.MOD_HIST_CONTRACT_ID,
  CT.CONTRACT_TITLE,
  CT.CONTRACT_DESC,
  CT.CONTRACT_BUDGET

FROM MODULE_HIST MD

JOIN CONTRACT_HIST CT ON CT.CONTRACT_ID=MD.MOD_HIST_CONTRACT_ID
AND CT.CONTRACT_HIST_ID = (
  SELECT MAX(CONTRACT_HIST_ID) 
  FROM CONTRACT_HIST
  WHERE CONTRACT_HIST.CONTRACT_ID = MD.MOD_HIST_CONTRACT_ID
  AND CONTRACT_HIST.CONTRACT_HIST_DT_CRE < MD.MODULE_HIST_DT_CRE
  )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM