[英]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.