Comment puis-je créer une vue dans Oracle avec une colonne dont le contenu dépend des valeurs combinées des entités appartenant?

Robert:

Dans une application Java à partir d'une base de données Oracle SQL, j'ai le problème suivant pour résoudre:

Une entité DataDeliverypeut être constitué d'un nombre quelconque de Packet. Packeta une PacketStatuset la clé étrangère datadeliveryid.

PacketStatus est un Enum avec les valeurs suivantes:

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

La valeur numérique est stockée dans la colonne PacketStatusdans le tableau PAQUET.

À mon avis, je veux afficher la DataDeliverysous forme de lignes de table comprenant une colonne qui affiche l'état combiné de tous les paquets se rapportant. L'état combiné des Packets est déterminée selon la logique ci - dessous:

  • Si tout un paquet appartenant à un DataDelivery a le statut « erreur »: colonne View doit afficher « erreur ».

  • Si tout un paquet appartenant à un DataDelivery a le statut « d'attente »: colonne View doit afficher « attente ».

  • Si tous les paquets appartenant à un DataDelivery ont le statut « traité »: colonne View doit afficher « traitée ».

  • Si tous les paquets appartenant à un DataDelivery le statut « traitement »: colonne View doit afficher un « traitement ».

  • Si tous les paquets appartenant à un DataDelivery ont soit le statut « traité » ou « traitement »: colonne View doit afficher un « traitement ».

Dans tous les autres cas, la colonne de vue doit afficher: « erreur ».

Mureinik:

countIgnore nulls. Vous pouvez utiliser ce fait pour effectuer une countsur une caseexpression de compter combien de paquets sont dans lesquels le statut. A partir de là, il est une question de coller le tout avec cases:

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

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=338277&siteId=1
conseillé
Classement