Sql-Server

在 hql 中加入兩個子查詢

  • February 13, 2014

如何將這個 sql 查詢寫成 hql:

select count(distinct s.id) as prepaid, count(distinct ss.id) as postpaid
from (select * from subscriber where subscriber.ispostpaid=0) s 
join (select * from subscriber where ispostpaid=1) ss 
where s.subscriber_status='active';

或者可以通過僅使用子查詢而不使用連接來進行此查詢。

假設我了解您要返回的內容,並假設subscriber.id在表中是唯一的(似乎很可能),這是一個 SQL Server 答案(儘管它應該適用於 MySQL):

select
   isnull(sum((case when s.ispostpaid = 0 and s.subscriber_status = 'active' then 1 else 0 end)), 0) as prepaid,
   isnull(sum((case when s.ispostpaid = 1 then 1 else 0 end)), 0) as postpaid
   from subscriber s;

這有選擇地使用一個表訪問來計算感興趣的行,而不是在原始查詢中進行昂貴的交叉連接和分組。如果表為空,則使用ISNULLis 仍返回 0 計數。

使用 NHibernate,我相信這也可以使用ICriteria… 編寫,但我已經有一段時間了。在此處查看我的答案,因為如果您正在尋找它可能會有所幫助。

嘗試這個..

SELECT     CASE WHEN ispostpaid=0 AND subscriber_status='active' THEN COUNT(DISTINCT S.ID) END AS PrePaid,
          CASE WHEN ispostpaid=1 THEN COUNT(DISTINCT S.ID) END AS PostPaid
FROM       Subscriber
GROUP BY   ispostpaid

引用自:https://dba.stackexchange.com/questions/58736