簡體   English   中英

如果所有子記錄中的字段都相同,如何選擇字段值

[英]How to select the field value if field in all child records are the same

我不知道我是否正確地表達了這個問題,但是到了。

這是一個使用java,oracle,hibernate的Web應用程序。

我在一個(項目)對許多(任務)的關系中有2個表。

物品

  • item_id名稱
  • active_status
  • 等等

任務

  • task_id
  • item_id
  • active_status
  • progress_status
  • 等等

該項目的狀態由其所有任務的狀態組成。 這是邏輯……

  • 如果項目狀態被取消或處於保留中...返回項目活動狀態
  • 如果沒有任務,則返回已完成
  • 如果所有任務都處於活動狀態並且未被取代,則
  • ...如果未啟動所有任務,則返回未啟動
  • ...如果所有任務均已完成,則返回已完成
  • ...如果所有任務都處於保留狀態,則返回保留狀態
  • 否則返回Started

我想使用SQL並將其映射到休眠映射文件中的字段中。

在過去的幾天里,我已經嘗試了很多事情,但似乎無法使其正常工作。 我嘗試對記錄進行分組,如果找到1條記錄,則返回該狀態。 我用過解碼,大小寫等

這是我嘗試過的一些例子。 在第二個示例中,我收到“不是單個組組函數”錯誤。

有什么想法嗎?

select decode(i.active_status_id, 'OH', i.active_status_id, 'Ca', i.active_status_id,t.progress_status_id)
        from tasks t 
        LEFT OUTER JOIN Items i
                ON i.item_id = t.item_id
        where t.item_id = 10927815 and t.active_status_id = 'Ac' and t.active_status_id != 'Su' 
        group by i.active_status_id, t.progress_status_id;




select case                         
        when (count(*) = 1) then progress_status_id
        else 'St'
        end
        from 
        (select progress_status_id
                from tasks t 
                        where t.item_id = 10927815 and (t.active_status_id = 'Ac' and t.active_status_id != 'Su') group by t.progress_status_id)

也許是這樣的

SELECT 
  item_id
, CASE 
    WHEN active_status IN ('Canceled', 'On Hold') THEN active_status
    WHEN t_num = 0 THEN 'Completed'
    WHEN flag_all_active = 1 AND flag_all_not_started = 1 THEN 'Not Started'
    WHEN flag_all_active = 1 AND flag_all_completed = 1 THEN 'Completed'
    WHEN flag_all_active = 1 AND flag_all_on_hold = 1 THEN 'On Hold'
  ELSE 'Started'
  END
FROM
(
  SELECT 
      i.item_id
    , i.active_status
    , sum(CASE WHEN t.task_id is NULL THEN 0 ELSE 1 end ) as t_num
    , MIN( CASE t.active_status WHEN 'Ac' THEN 1 ELSE 0 END ) as flag_all_active 
    , MIN( CASE t.progress_status_id WHEN 'Not Starten' THEN 1 ELSE 0 END ) as flag_all_not_started
    , MIN( CASE t.progress_status_id WHEN 'Completed' THEN 1 ELSE 0 END ) as flag_all_completed
    , MIN( CASE t.progress_status_id WHEN 'On Hold' THEN 1 ELSE 0 END ) as flag_all_on_hold

  FROM 
    items i
    left outer join tasks t on (t.item_id = i.item_id )
  group by i.item_id
)
;

如果使用批注,則可以將@Formula("sql query here")用於派生屬性。 請參閱Hibernate公式文檔以獲取(令人驚訝的簡短)解釋。

另外,由於您要處理的項目列表相對較大,因此最好將狀態計算作為初始查詢的一部分,從而避免數據庫受到成百上千個請求的影響。 如果您遍歷列表中的每個項目,可能會發生這種情況。

我建議將狀態計算加入到用於生成列表的任何查詢中(大概在NamedQuery中)。 這樣一來,您的數據庫就可以完成所有繁重的工作,而不會因為網絡速度而減慢,這是最好的選擇。 Hibernate文檔提供了許多有用的查詢示例,您可以嘗試。

暫無
暫無

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

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