Запрос по атрибутам в предварительно запрошенных записях (Oracle) - PullRequest
0 голосов
/ 27 февраля 2020

Существует таблица MEETINGPARTICIPANT, как показано ниже, PK: ORGID, MEETINGID и PARTICIPANTID

Name               Null?    Type          
------------------ -------- ------------- 
ORGID              NOT NULL NUMBER(10)    
MEETINGID          NOT NULL VARCHAR2(32) 
PARTICIPANTID      NOT NULL VARCHAR2(32) 
EMPLOYEEID         NOT NULL VARCHAR2(32) 
DISPLAYNAME                 VARCHAR2(128) 
EMAIL                       VARCHAR2(128) 
JOINTIME           NOT NULL DATE          
LEAVETIME          NOT NULL DATE          
CREATETIME         NOT NULL DATE          
LASTMODIFIEDTIME   NOT NULL DATE 

Шаг 1, список записей по ORGID, MEETINGID и EMPLOYEEID, получить список записей.

SELECT
    *
FROM
    MEETINGPARTICIPANT
WHERE
    ORGID=#{orgId}
    AND MEETINGID=#{meetingId}
    AND EMPLOYEEID=#{employeeId}

Шаг 2, выполнить итерацию каждой записи шага 1, выполнить поиск снова по EMAIL и DISPLAYNAME шага 1, объединить в большой список записей

for (each record in step 1) {

    SELECT
        *
    FROM
        MEETINGPARTICIPANT
    WHERE
        ORGID=#{orgId}
        AND MEETINGID=#{meetingId}
        AND EMAIL=#{record.email} AND DISPLAYNAME=#{record.displayName}

    Merge searched records to mergedRecords
}

Шаг 3, возврат mergedRecords

Вопрос в том, как объединить SQL на шаге 1 и 2 в один SQL?

1 Ответ

0 голосов
/ 27 февраля 2020

Похоже, SQL ниже работает. NVL(EMAIL, ' ') и NVL(DISPLAYNAME, ' ') будут обрабатывать записи, чьи EMAIL или DISPLAYNAME равны нулю.

SELECT
    *
FROM
    MEETINGPARTICIPANT
WHERE
    ORGID=#{orgId}
    AND MEETINGID=#{meetingId}
    AND (NVL(EMAIL, ' '), NVL(DISPLAYNAME, ' ')) IN (
        SELECT
            NVL(EMAIL, ' '), NVL(DISPLAYNAME, ' ')
        FROM
            MEETINGPARTICIPANT
        WHERE
            ORGID=#{orgId}
            AND MEETINGID=#{meetingId}
            AND EMPLOYEEID=#{employeeId}
    )
...