Oracle SQL объединяет два одинаковых запроса - PullRequest
0 голосов
/ 22 февраля 2012

Хорошо, сначала я попытаюсь объяснить, что я пытаюсь сделать. Я пытаюсь создать отчет, который возвращает все оценки, назначенные клиенту. Каждой оценке должно соответствовать событие, и наоборот (к сожалению, между ними нет токена, поэтому я должен определить правильное событие на основе дат). Тем не менее, событие иногда отсутствует, или оценка иногда отсутствует. Я хочу охватить все это, чтобы я мог сообщить, где отсутствуют недостающие оценки или события, и исправить их. В его самой простой форме, это то, что я ожидаю, что отчет будет выглядеть. Однако есть несколько других условий, таких как возвращение определенного типа оценки и определенного типа события.

ID  Assessment   Event
1   A1           B1
2   A2   
3                B3      

В настоящее время у меня есть 2 запроса, которые показывают мне все оценки с соответствующими событиями (если они есть) и все события с соответствующими оценками (если они есть). Кажется, они оба работают хорошо, но мне бы очень хотелось объединить два запроса (идентификатор был бы общим в обоих запросах). Я пытался сделать это сам, но это не совсем работает, так что я надеюсь, что если я опубликую оба моих рабочих запроса, кто-то сможет помочь!

Это возвращает оценки с соответствующим событием (если оно присутствует).

 SELECT 
  "CLIENTID",
 "Name",
   "ASSESSMENT_ID",
 "Assessment_Start", 
 "Assessment_End",
  "Days open",
 "Authorised",
  "Worker",
  "Event_ID",
  "Event_Start"
 FROM 
 (SELECT 
 OAS.ASM_SUBJECT_ID as "CLIENTID",
   nvl(olm_bo.get_name(OAS.ASM_SUBJECT_ID,OAS.ASM_SUBJECT_IND),'') as "Name",
 OAS.ASM_ID as ASSESSMENT_ID,
 olm_bo.working_days(OAS.ASM_START_DATE, OAS.ASM_END_DATE) -1 as "Days open",
 OAS.ASM_AUTH_DATETIME as "Authorised",
 OAS.ASM_START_DATE as "Assessment_Start", 
 OAS.ASM_END_DATE as "Assessment_End",
 nvl(olm_bo.get_ref_desc(OAS.ASM_OUTCOME,'ASM_OUTCOME'),'') as "Outcome",
 nvl(olm_bo.get_org_name(ORE.RES_PARTY_OUN_ID),'') as "Team",
 initcap(nvl(olm_bo.get_per_name(ORE.RES_PARTY_ID),'')) as "Worker",
 OSE.SEV_ID as "Event_ID",
 to_char(trunc(OSE.SEV_ACTUAL_DATE),'DD/MM/YYYY') as "Event_Start",
 OSE.SEV_OUTCOME_DATE as "Event_End",
 nvl(decode(OSE.SEV_CLASS,'CPINVEST',olm_bo.get_ref_desc     (OSE.SEV_REASON_CODE,'CP_JUSTIFICATION'),olm_bo.get_ref_desc     (OSE.SEV_REASON_CODE,'REASON_CODE')),'') as "Event Outcome",
 row_number() over(PARTITION BY  OAS.ASM_ID                   
 ORDER BY 
 abs(OAS.ASM_START_DATE -  OSE.SEV_ACTUAL_DATE))as "Row Number"
 FROM O_ASSESSMENTS OAS      
 INNER JOIN O_RESPONSIBILITIES ORE ON OAS.ASM_ID = ORE.RES_REC_ID
 AND nvl(olm_bo.get_org_name(ORE.RES_PARTY_OUN_ID),'') = '#Team#' 
 LEFT JOIN O_SERVICE_EVENTS OSE ON OAS.ASM_SUBJECT_ID = OSE.SEV_SUBJECT_ID 
 AND            
 OSE.SEV_CODE IN ('INI') 
 AND             
 ROUND(OAS.ASM_START_DATE - OSE.SEV_ACTUAL_DATE,0) >= -7
 AND
 ROUND(OAS.ASM_START_DATE - OSE.SEV_ACTUAL_DATE,0) <= 7
 Where OAS.ASM_QSA_ID  IN ('A1','A2')
 AND
    nvl(olm_bo.get_ref_desc(OAS.ASM_OUTCOME,'ASM_OUTCOME'),'NULL')  NOT IN       ( 'Abandon'  )
 AND
    (
     OAS.ASM_END_DATE  Is Null  
     OR
     OAS.ASM_AUTH_DATETIME  Is Null  
    )
 ) WHERE "Row Number" = 1

Это возвращает события с их соответствующей оценкой (если присутствует).

 SELECT 
  "CLIENTID",
 "Name",
   "Event_ID",
 "Event_Start", 
 "Event_End",
  "Days_open",
  "Worker",
 "Team",
  "Assessment_ID",
  "Assessment_Start",
 "Assessment_End",
 FROM 
 (SELECT 
 OSE.SEV_SUBJECT_ID as "CLIENTID",
   nvl(olm_bo.get_name(OSE.SEV_SUBJECT_ID,OSE.SEV_SUBJECT_IND),'') as "Name",
 OAS.ASM_ID as  "Assessment_ID",
 olm_bo.working_days(OSE.SEV_ACTUAL_DATE, OSE.SEV_OUTCOME_DATE) -1 as "Days_open",
 OAS.ASM_START_DATE as "Assessment_Start", 
 OAS.ASM_END_DATE as "Assessment_End",
 olm_bo.get_org_name(OSE.SEV_OUN_SHORT_NAME) as "Team",
 olm_bo.get_event_worker(OSE.SEV_ID,'NAME') as "Worker",
 OSE.SEV_ID as "Event_ID",
 to_char(trunc(OSE.SEV_ACTUAL_DATE),'DD/MM/YYYY') as "Event_Start",
 OSE.SEV_OUTCOME_DATE as "Event_End",
 nvl(decode(OSE.SEV_CLASS,'CPINVEST',olm_bo.get_ref_desc     (OSE.SEV_REASON_CODE,'CP_JUSTIFICATION'),olm_bo.get_ref_desc(OSE.SEV_REASON_CODE,'REASON_CODE')),'') as "Event Outcome",
 row_number() over(PARTITION BY  OSE.SEV_SUBJECT_ID                   
 ORDER BY 
 abs(OAS.ASM_START_DATE -  OSE.SEV_ACTUAL_DATE))as "Row Number"
 FROM O_SERVICE_EVENTS OSE
 LEFT JOIN O_ASSESSMENTS OAS ON OAS.ASM_SUBJECT_ID = OSE.SEV_SUBJECT_ID AND nvl     (olm_bo.get_ref_desc(OAS.ASM_OUTCOME,'ASM_OUTCOME'),'NULL')  NOT IN  ( 'Abandon'  )
 AND
 OAS.ASM_QSA_ID  IN ('A1','A2')            
 AND             
 ROUND(OAS.ASM_START_DATE - OSE.SEV_ACTUAL_DATE,0) >= -7
 AND
 ROUND(OAS.ASM_START_DATE - OSE.SEV_ACTUAL_DATE,0) <= 7
 Where OSE.SEV_CODE IN ('INITASS') 
 AND
 olm_bo.get_org_name(OSE.SEV_OUN_SHORT_NAME) = '#Team#'
 AND
    (
     OSE.SEV_OUTCOME_DATE  Is Null  
    )
 ) WHERE "Row Number" = 1

Существуют также некоторые уловы с объединенным отчетом - у событий и оценок могут быть разные команды или работники, поэтому мне, вероятно, потребуется определить отдельную команду мероприятия и работников мероприятия из группы оценки и работника мероприятия. Я действительно думал, что этого можно достичь путем внешнего объединения или объединения оценок и событий в отдельной таблице, которая возвращает всех клиентов с оценкой или событием, но, как уже упоминалось, результаты никогда не складывались отдельные запросы. Я думаю, что это может быть связано с условием номер строки = 1, это поможет вернуть соответствующую оценку событию или наоборот, но я думаю, что при попытке присоединиться к ним, это может вызвать некоторые из проблемы? В любом случае, спасибо за ваше время - я буду продолжать возиться и посмотреть, смогу ли я найти решение, но любые советы или предложения будут высоко оценены.

Ответы [ 3 ]

1 голос
/ 23 февраля 2012

Как сказал BD, FULL OUTER JOIN сделает свое дело, но UNION также может быть хорошей идеей

1 голос
/ 23 февраля 2012

Почему бы вам не объединить 2 ваших запроса?Если применимо, используйте union all , что намного лучше, чем union .

1 голос
/ 22 февраля 2012

Вы пробовали ПОЛНОЕ НАРУЖНОЕ СОЕДИНЕНИЕ? http://www.oreillynet.com/network/2002/04/23/fulljoin.html

SQL> select p.part_id, s.supplier_name
  2  from part p full outer join supplier s
  3  on p.supplier_id = s.supplier_id;

PART SUPPLIER_NAME
---- --------------------
P1   Supplier#1
P2   Supplier#2
P4
P3
     Supplier#3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...