Уточните условие WHERE в запросе ORACLE для промежуточных таблиц

Я ищу некоторую помощь с уточнением WHERE условие SQL-запроса к набору связанных промежуточных таблиц данных Oracle.

Одна таблица предназначена для данных случая, содержащих метаданные о записи. В этой таблице есть только одна запись для каждого случая. В этой таблице есть столбец флага, который помечает данные дела как Processed как только данные прочитаны и отправлены в другую базу данных. case_staging_table

CASE_NUMBER CASE_DETAILS PARENT_ID_NUMBER PROCESSED_FLAG
0001        First Case   X0001            NULL
0002        Second Case  X0002            NULL
0003        Third Case   X0003            Processed

Вторая таблица предназначена для данных вложений и содержит метаданные о вложениях файлов, которые связаны с данными дела. Возможно, в этой таблице несколько записей для каждого случая. В этой таблице есть столбец флага, который помечает вложение как Отправленное, если полученный файл передается на сервер. attachment_staging_table

ID_NUMBER PARENT_ID_NUMBER ATTACHMENT_NAME               ATTACHMENT_SENT_FLAG
A0001     X0001            First Case Attachment 1.docx  N
A0002     X0001            First Case Attachment 2.docx  N
A0003     X0001            First Case Attachment 3.docx  Y
A0004     X0003            Third Case Attachment.docx    Y

Что мне нужно сделать, это построить WHERE условие запроса, при котором я извлекаю только записи дел, в которых дело НЕ было обработано, а ВСЕ записи вложений содержат Y или NULL в ATTACHMENT_SENT_FLAG столбец (а NULL будет присутствовать, если запись дела не содержит вложений). Если какая-либо из связанных записей в промежуточной таблице вложений имеет N в ATTACHMENT_SENT_FLAG столбец, я не хочу, чтобы запись о делах появлялась в результатах запроса.

В этом сценарии:

  • Номер дела 0001 не был обработан, имеет три вложения, связанные с ним, и только одно из вложений было отправлено на сервер.
  • Номер дела 0002 не был обработан и не имеет вложений, связанных с ним.
  • Номер дела 0003 уже был обработан.

Результаты запроса на этом этапе должны включать только номер дела 0002, так как он не был обработан и не должен ждать никаких вложений. Результаты запроса не должны содержать номер дела 0001, поскольку два вложения еще не готовы и не должны содержать номер дела 0003, как это уже было обработано.

Мой текущий запрос имеет следующее условие ГДЕ:

SELECT 
    case.staging_table.CASE_NUMBER,
    case_staging_table.CASE_DETAILS,
    attachment_staging_table.ATTACHMENT_NAME
FROM
    case_staging_table
    LEFT JOIN attachment_staging_table 
        ON case_staging_table.PARENT-ID = attachment_staging_table.PARENT_ID
WHERE 
    case_staging_table.PROCESSED_FLAG IS NULL
    AND (
        attachment_staging_table.ATTACHMENT_SENT_FLAG = ‘Y’
        OR attachment_staging_table.ATTACHMENT_SENT_FLAG IS NULL
    )

это WHERE однако условие все равно будет обрабатывать номер дела 0001 и пометить его как Обработанный, как только оно попадет в третье вложение, отправленное на сервер.

Заранее спасибо за вашу помощь!

1 ответ

Решение

Фильтр attachment_staging_table записи, которые имеют ATTACHMENT_SENT_FLAG = 'N', как это:

SELECT 
    case_staging_table.CASE_NUMBER,
    case_staging_table.CASE_DETAILS,
    attachment_staging_table.ATTACHMENT_NAME
FROM
    case_staging_table
    LEFT JOIN attachment_staging_table 
        ON case_staging_table.PARENT_ID_NUMBER = attachment_staging_table.PARENT_ID_NUMBER
WHERE 
    case_staging_table.PROCESSED_FLAG IS NULL
    AND case_staging_table.PARENT_ID_NUMBER not in 
        ( select x.PARENT_ID_NUMBER
          from attachment_staging_table x      
          where x.ATTACHMENT_SENT_FLAG = 'N'
            )
Другие вопросы по тегам