Выбор записей на основе различных условий в столбце - PullRequest
1 голос
/ 29 мая 2020

Ниже приведены образцы записей в 2 таблицах

Таблица людей

Per_Id      +     Per_type   
--------------------------------------------
000001            SINGULAR
000002            COLLECTIVE
000003            INSTITUTION
000004            INSTITUTION
000005            SINGULAR

Таблица символов человека

Per_Id      +     Char_Type        +    Char_Val
-------------------------------------------------------------------------------
000002            STAT_TY               SUSPENSION
000002            STAT                  COMPLETE

000003            STAT_TY               SUSPENSION
000003            STAT                  COMPLETE

000004            STAT_TY               CESSATION
000004            STAT                  COMPLETE

000005            STAT_TY               DEATH
000005            STAT                  PENDING

Требование состоит в том, что мне нужно выбрать людей со следующими условиями:

  1. Человек, у которого нет записи в таблице Person Char (Работает нормально)
  2. Человек, у которого есть запись в таблица символов, но значение char STAT НЕ ЗАВЕРШЕНО (Работает нормально)
  3. Человек типа INSTITUTION, у которого есть char со значением SUSPENSION

В приведенной выше таблице идентификаторы людей, возвращенные из запрос:

000001 (No record in char table)
000005 (The value of STAT char is not COMPLETE)
000003 (Institution person and char value is SUSPENSION)

Ниже приведен запрос, в котором мне нужна помощь в предложении для выбора записей, удовлетворяющих пункту 3.

SELECT P.PER_ID,
C.CHAR_VAL, C1.CHAR_VAL
FROM PERSON_TBL P
LEFT OUTER JOIN CHAR_TBL C ON C.PER_ID = P.PER_ID AND C.CHAR_TYPE = 'STAT_TY'
LEFT OUTER JOIN CHAR_TBL C1 ON C1.PER_ID = P.PER_ID AND C1.CHAR_TYPE = 'STAT'
WHERE
1=1
AND NVL(C.CHAR_VAL,' ')  NOT IN ('CESSATION','DEATH')
AND NVL(STCS.SRCH_CHAR_VAL,' ')  NOT IN ('COMPLETE')
AND ***need clause for selecting person of type SINGULAR and with char SUSPENSION***

1 Ответ

1 голос
/ 29 мая 2020

Как насчет exists и not exists:

select p.*
from person_tbl p
where not exists (select 1
                  from person_char pc
                  where pc.per_id = p.per_id
                 ) or
      exists (select 1
              from person_char pc
              where pc.per_id = p.per_id and
                    pc.char_type = 'STAT' and
                    pc.char_value <> 'COMPLETE'
            ) or
      (p.per_type = 'INSTITUTION' and
       exists (select 1
               from person_char pc
               where pc.per_id = p.per_id and
                     pc.char_type = 'STAT_TY' and
                     pc.char_value = 'SUSPENSION'
             )
      );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...