Представьте таблицу - resume
- в базе данных, содержащей документы, и каждый документ содержит много компонентов. Строки в этой таблице может быть либо сам по себе (метаданные для документа) документа или компоненты этого документа:Возвратите все соответствующие строки в Oracle на основе одной строки
row_id name resume_id last_upd
1 resume_1 2010-1-1
2 section_1 1 2008-12-1
3 section_2 1 2009-6-1
4 resume_2 2010-1-1
5 section_1 4 2014-12-30
В приведенном выше примере, строки 1 и 4 представляют собой документы сами с дополнительными столбцами, содержащими метаданные , а строки 2, 3 и 5 являются компонентами документов, которые могут быть сопоставлены с resume_id
.
Что я пытаюсь сделать, это вернуть полный документ (основную запись и компоненты) из этой таблицы, если какая-либо из этих строк (основная запись или компоненты) была обновлена в течение одного года. Если какой-либо элемент документа отредактирован, только эта строка содержит обновленный столбец last_upd
.
Вот запрос я построил до сих пор, но это довольно медленно, и я пытаюсь разобраться, как сделать это быстрее:
SELECT meta_data.row_id as "resume_id",
meta_data.name as "resume_name",
components.name as "component_name"
FROM
(
SELECT DISTINCT(updated_meta_data.row_id)
FROM resume updated_meta_data
LEFT JOIN resume updated_components ON updated_components.resume_id = updated_meta_data.row_id
WHERE ((updated_components.last_upd > (SYSDATE - 365)) or (updated_meta_data.last_upd > (SYSDATE - 365)))
) updated_resumes
LEFT JOIN resume meta_data ON updated_resumes.row_id = meta_data.row_id
LEFT JOIN resume components ON components.resume_id = meta_data.row_id
Я думаю, что мой запрос работает, но в случае, если это Безразлично «т, или если это не ясно, что я пытаюсь сделать, мой запрос должен возвращать:
resume_id resume_name component_name
4 resume_2
4 resume_2 section_1
Возможно, вы захотите подумать о переименовании своих столбцов, чтобы указать отношения между родителем и ребенком? row_id можно путать с Oracle rowid. – OldProgrammer