簡體   English   中英

如何在 Oracle 中創建包含內容取決於相關實體組合值的列的視圖?

[英]How can I create a View in Oracle with a column whose content depends on the combined values of pertaining entities?

在基於Oracle SQL數據庫的Java應用中,我有以下問題需要解決:

實體DataDelivery可以包含任意數量的Packet Packet有一個PacketStatus和外鍵datadeliveryid

PacketStatus是一個枚舉值:

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

數值存儲在表 PACKET 的PacketStatus列中。

在我看來,我想將DataDelivery顯示為表行,其中包括一個列,該列顯示所有相關數據包的組合狀態。 Packets 的組合狀態應根據以下邏輯確定:

  • 如果與 DataDelivery 相關的任何一個數據包的狀態為“錯誤”:查看列應顯示“錯誤”。

  • 如果與 DataDelivery 相關的任何一個數據包具有“等待”狀態:查看列應顯示“等待”。

  • 如果與 DataDelivery 相關的所有數據包都具有“已處理”狀態:查看列應顯示“已處理”。

  • 如果與 DataDelivery 相關的所有數據包都處於“正在處理”狀態:查看列應顯示“正在處理”。

  • 如果與 DataDelivery 相關的所有數據包都處於“已處理”或“正在處理”狀態:查看列應顯示“正在處理”。

在所有其他情況下,視圖列應顯示:'error'。

count忽略null s。 您可以使用此事實對case表達式執行count ,以計算處於哪種狀態的數據包數量。 從那時起,這是將所有內容與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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM