2015-08-19 2 views
0

Не могли бы вы помочь мне создать представление на основе таблиц истории?Oracle SQL Request - SELECT в SELECT с MAX значением

Контекст: Когда обновление выполнено (до даты t), создается новая строка (новый идентификатор HIST) в соответствующей таблице.

Здесь структура моей базе данных:

enter image description here

ID HIST в обеих таблицах различны и не связаны между собой. Контракт только ID связан.

Я бы хотел, чтобы представление извлекало все данные (благодаря ID_HIST и созданию даты) из обеих таблиц, отсортированных по дате. Если обновление касается таблицы модулей то все последние значения по контракту, соответствующее последнему обновлению должно быть restrieved) как:

enter image description here

Я пытаюсь сделать это, но у меня есть трудности в целях осуществления часть для получения обновлений модулей, присоединенных к последним обновлениям контрактов (последняя строка контракта, дата контракта < дата модуля).

Здесь запрос используется:

--- 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 
+0

это не работает так. Вы должны попытаться сделать это самостоятельно и задать ** конкретный ** вопрос. – smnbbrv

+0

Привет, я попытался, но, как объяснено, результаты по данным контракта для обновления модуля не были правильно восстановлены (последняя строка все еще возвращается, а не последнее обновление). Здесь, по моему запросу: – coeurdange57

+0

, вы не можете сделать выделение по одному значению ... – smnbbrv

ответ

0

Я хотел бы предложить, что ваша модель данных нуждается в улучшении. Когда вы помещаете данные в базу данных, вам нужно подумать о том, как вы в конечном итоге захотите вернуть ее. В этом случае вы должны вставить «контрактную версию №» в историю контрактов и таблицы «История модулей», чтобы вы могли напрямую подключаться к данным.

Однако, учитывая модель данных, как это, попробуйте следующее:

--- 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; 
0

Я решить мою проблему путем обновления запроса:

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 
)