У меня есть 5 таблиц, которые я должен использовать, чтобы получить комплект ожидающих документов для заявления о краже.Я использую Oracle 10g.Структуры таблиц приведены ниже.
1. mo_documents_master -- master table for all document types
CREATE TABLE "MO_DOCUMENT_MASTER"
(
"DOC_ID" NUMBER NOT NULL ENABLE,
"DOC_TYPE_NAME" VARCHAR2(100 BYTE),
"STATUS" VARCHAR2(50 BYTE),
CONSTRAINT "MO_DOCUMENT_MASTER_PK" PRIMARY KEY ("DOC_ID")
)
2. mo_theft_pvt_documents -- Contains list of documents applicable for a theft claim; they can be mandatory or optional
CREATE TABLE "MO_THEFT_PVT_DOCUMENTS"
(
"DOC_ID" NUMBER NOT NULL ENABLE,
"STAGE" VARCHAR2(20 BYTE),
"IS_MANDATORY" VARCHAR2(10 BYTE), -- true or false; true means document is mandatory
CONSTRAINT "MO_THEFT_DOCUMENTS_PK" PRIMARY KEY ("DOC_ID")
CONSTRAINT "MO_THEFT_PVT_DOCUMENTS_MO_FK1" FOREIGN KEY ("DOC_ID") REFERENCES "MO_DOCUMENT_MASTER" ("DOC_ID") ENABLE
)
3. mo_theft_pvt_doc_queue -- Mapping of which documents are applicable for a particular queue
CREATE TABLE "MO_THEFT_PVT_DOC_QUEUE"
(
"DOC_ID" NUMBER NOT NULL ENABLE,
"QUEUE_ID" NUMBER NOT NULL ENABLE,
CONSTRAINT "MO_THEFT_DOC_QUEUE_PK" PRIMARY KEY ("DOC_ID", "QUEUE_ID")
CONSTRAINT "MO_THEFT_DOC_QUEUE_MO_QUE_FK1" FOREIGN KEY ("QUEUE_ID") REFERENCES "MO_QUEUE_MASTER" ("ID") ENABLE,
CONSTRAINT "MO_THEFT_PVT_DOC_QUEUE_MO_FK1" FOREIGN KEY ("DOC_ID") REFERENCES "MO_THEFT_PVT_DOCUMENTS" ("DOC_ID") ENABLE
)
4. mo_claim_documents -- list of uploaded documents for a claim.
CREATE TABLE "MO_CLAIM_DOCUMENTS"
(
"ID" NUMBER NOT NULL ENABLE,
"CLAIM_REF_NO" VARCHAR2(50 BYTE),
"DOC_ID" NUMBER,
"DOCUMENTURL" VARCHAR2(255 BYTE),
"FILENAME" VARCHAR2(255 BYTE),
"UPLOADED_ON" TIMESTAMP (6),
"UPLOADED_BY" VARCHAR2(100 BYTE),
"STATUS" VARCHAR2(30 BYTE), -- STATUS can be 'Active' or 'Inactive'
CONSTRAINT "M0_CLAIM_DOCUMENTS_PK" PRIMARY KEY ("ID")
CONSTRAINT "MO_OD_CLAIM_DOCUMENTS_MO__FK1" FOREIGN KEY ("CLAIM_REF_NO") REFERENCES "MO_CLAIM_MASTER" ("CLAIM_REF_NO") ENABLE,
CONSTRAINT "MO_OD_CLAIM_DOCUMENTS_MO__FK2" FOREIGN KEY ("DOC_ID") REFERENCES "MO_DOCUMENT_MASTER" ("DOC_ID") ENABLE
)
5. mo_claim_doc_waiver; -- list of document waiver requests for a claim
CREATE TABLE "MO_CLAIM_DOC_WAIVER"
(
"ID" NUMBER NOT NULL ENABLE,
"CLAIM_REF_NO" VARCHAR2(50 BYTE),
"DOC_ID" NUMBER,
"REQUESTED_DATE" TIMESTAMP (6),
"REQUSETED_BY" VARCHAR2(200 BYTE),
"ACTION_DATE" TIMESTAMP (6),
"ACTION_BY" VARCHAR2(200 BYTE),
"REQUEST_REMARKS" VARCHAR2(255 BYTE),
"ACTION_REMARKS" VARCHAR2(255 BYTE),
"STATUS" VARCHAR2(50 BYTE), -- STATUS can be 'Waiver Requested', 'Waived' or 'Rejected'
CONSTRAINT "MO_CLAIM_DOC_WAIVER_PK" PRIMARY KEY ("ID")
CONSTRAINT "MO_CLAIM_DOC_WAIVER_MO_CL_FK1" FOREIGN KEY ("CLAIM_REF_NO") REFERENCES "MO_CLAIM_MASTER" ("CLAIM_REF_NO") ENABLE,
CONSTRAINT "MO_CLAIM_DOC_WAIVER_MO_DO_FK1" FOREIGN KEY ("DOC_ID") REFERENCES "MO_DOCUMENT_MASTER" ("DOC_ID") ENABLE
)
Мое требование - найти список обязательных документов, «остающихся» для определенного QUEUE_ID и CLAIM_REF_NO (эти 2 являются входными данными для запроса).
«Остальные» документы заявки («CLAIM_REF_NO») - это те документы, которые являются «обязательными» для определенного «QUEUE_ID» и которые не были загружены или отменены.Кроме того, мне нужен статус для каждого типа документа «Остаток». Статус может быть. «Ожидание» (документ не загружен или загружен, но сделан неактивным или запрос отклонен) б. «Запрошен отказ» (документ, который не являетсязагружен и статус Waiver Requested ')
Мне нужен только один статус для определенного типа документа (например, если документ, который не был загружен, имеет 2 статуса - «Waiver Requested» и «Rejected» втаблица «MO_CLAIM_DOC_WAIVER», то запрос должен вернуть статус для этого документа как «Запрошенный отказ». Причина такого требования заключается в том, что пользователь не должен иметь возможность сделать новый запрос отказа, если существует запрос отказаеще не утвержден или отклонен.
Я создал следующий запрос. Но мой запрос не выполняется, если в таблице MO_CLAIM_DOC_WAIVER есть 2 записи со статусами «Запрошен отказ» и «Отклонен». Пожалуйста, предоставьте решение, используяSQL или процедура.
select distinct b.doc_id, c.doc_type_name, b.stage, b.is_mandatory, b.queue_id, case when a.status = 'Waiver Requested' then 'Waiver Requested' else 'Pending' end as status
FROM
(SELECT tpd.doc_id, tpd.stage, tpd.is_mandatory, tpdq.queue_id
FROM mo_theft_pvt_documents tpd , mo_theft_pvt_doc_queue tpdq
WHERE tpd.is_mandatory='true' and tpd.doc_id = tpdq.doc_id AND tpdq.queue_id =:queue_id AND tpd.doc_id NOT IN (SELECT doc_id FROM mo_claim_documents where status ='Active'and claim_ref_no =:claim_ref_no UNION all SELECT doc_id from mo_claim_doc_waiver WHERE claim_ref_no =:claim_ref_no AND status = 'Waived')
) b
LEFT JOIN mo_claim_doc_waiver a on b.doc_id=a.doc_id
left join mo_document_master c on b.doc_id=c.doc_id
order by 1;