Объединение данных из 5 таблиц без повторяющихся значений и получение результата с пользовательским статусом в Oracle 10g - PullRequest
0 голосов
/ 14 ноября 2011

У меня есть 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;

1 Ответ

1 голос
/ 14 ноября 2011

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

Убедитесь, что вы включили все другие возможные статусы, если заботитесь о порядке для остальных из них.

with t1 as
( select 1 id, 'Waiver Requested'        status from dual union all
  select 1 id, 'Rejected'        status from dual union all
  select 2 id, 'Waiver Requested'        status from dual union all
  select 2 id, 'Waiver Requested'        status from dual union all
  select 3 id, 'Rejected'                status from dual union all
  select 3 id, 'Rejected'                status from dual union all
  select 4 id, 'Waiver Requested'        status from dual union all
  select 4 id, 'Cancelled'               status from dual
)
select id,
       status,
       max(status) KEEP (DENSE_RANK FIRST
                         order by (case when status ='Rejected' then -1
                                            else 1
                                       end) desc)
          over (partition by id) final_status
  from t1

        ID STATUS           FINAL_STATUS
---------- ---------------- ----------------
         1 Waiver Requested Waiver Requested
         1 Rejected         Waiver Requested
         2 Waiver Requested Waiver Requested
         2 Waiver Requested Waiver Requested
         3 Rejected         Rejected
         3 Rejected         Rejected
         4 Waiver Requested Waiver Requested
         4 Cancelled        Waiver Requested
...