Как я могу создать представление в Oracle со столбцом, содержимое которого зависит от объединенных значений соответствующих сущностей? - PullRequest
1 голос
/ 20 марта 2020

В приложении Java на основе базы данных Oracle SQL мне нужно решить следующую проблему:

Сущность DataDelivery может состоять из любого числа Packet. Packet имеет PacketStatus, а внешний ключ datadeliveryid.

PacketStatus - это Enum со значениями:

0, processed
1, processing
2, error
3, waiting

Числовое значение c сохраняется в столбце PacketStatus в таблице PACKET.

На мой взгляд, я хочу отобразить DataDelivery в виде строк таблицы, включая столбец, который отображает объединенное состояние всех соответствующих пакетов. Объединенный статус Пакетов должен быть определен согласно логике c ниже:

  • Если какой-либо один Пакет, относящийся к DataDelivery, имеет статус «ошибка»: столбец просмотра должен отображать « ошибка. Если все пакеты, относящиеся к DataDelivery, имеют статус «обработан»: столбец просмотра должен отображать «обработано».

  • Если все пакеты, относящиеся к DataDelivery, имеют статус «обработка»: столбец просмотра должен отображать «обработка».

  • Если все пакеты, относящиеся к DataDelivery, имеют статус «обработан» или «обработка»: в столбце просмотра должно отображаться «обработка».

Во всех остальных случаях в столбце просмотра должно отображаться: «ошибка».

1 Ответ

1 голос
/ 20 марта 2020

count игнорирует null с. Вы можете использовать этот факт для выполнения выражения count над case, чтобы подсчитать, сколько пакетов находится в каком состоянии. С этого момента нужно склеить все вместе с case s:

SELECT dd.*, status
FROM   DataDelivery dd
JOIN   (SELECT   dataDeliveryId,
                 CASE WHEN COUNT(CASE status WHEN 2 THEN 1 END) > 0 THEN 'error'
                      WHEN COUNT(CASE status WHEN 3 THEN 1 END) > 0 THEN 'waiting'
                      WHEN COUNT(CASE status WHEN 0 THEN 1 END) = COUNT(*) THEN 'processed'

                      WHEN COUNT(CASE status WHEN 1 THEN 1 END) = COUNT(*) THEN 'processing'
                ELSE 'error' END AS status
        FROM     packet
        GROUP BY dataDeliveryId) p ON dd.dataDeliveryId = p.dataDeliveryId
...