Уточните условие WHERE в запросе ORACLE для промежуточных таблиц - PullRequest
0 голосов
/ 04 декабря 2018

Мне нужна помощь в уточнении условия 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, так как он уже был обработан.

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

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 Ответ

0 голосов
/ 04 декабря 2018

Фильтр 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'
            )
...