2013-06-04 30 views
-1

爲了序言,我遠離程序員。不幸的是,我的任務是使用SQL作爲由我工作的公司的前員工創建的數據庫,修改一個基於ASP .NET的基於web的inout板。儘管不是程序員,但我的僱主似乎仍然希望把這件事放在我身上,所以如果我太模糊,我很抱歉。在VS2010 web項目中修改nhibernate的SQL查詢

基本上,我需要修改以下函數中的SQL查詢,以獲取「rsRank」列中的第二小值,而不是最小值(基本上排名第二的員工的職位是「In」,而不是目前排名最高)。我能夠在SQL管理工作室中構建一個SQL查詢,而不需要任何問題來獲取我需要的值,但無法弄清楚如何將它實現到下面的代碼中。我幾乎不知道nhibernate/HQL以及映射等是如何工作的。

public Employee GetCurrentDesignatedRS() 
    { 
     using (ISession session = _nhHelper.OpenSession()) 
     { 
      var employee = session.CreateQuery("from Employee emp1 where emp1.rsRank = (select min(emp2.rsRank) from Employee emp2 where emp2.Status = 'In' and emp2.rsRank > 0)").UniqueResult<Employee>(); 
      return employee; 
     } 
    } 

下面是SQL查詢我做了讓我我需要的值:

select top 1 emp2.rsRank from Employee emp2 where emp2.rsRank > (select min(emp2.rsRank) from Employee emp2) and emp2.Status='In' 

當然,如果我只需插上這個替代現有的查詢,我得到下面的異常:

Message: Exception of type 'Antlr.Runtime.NoViableAltException' was thrown. near line 1, column 87 [from CompanyName.InOut.Library.Entities.Employee emp1 where emp1.rsRank = (select top 1 emp2.rsRank from CompanyName.InOut.Library.Entities.Employee emp2 where emp2.rsRank > (select min(emp2.rsRank) from CompanyName.InOut.Library.Entities.Employee emp2) and emp2.Status='In')] 

我認爲這是一個遠投,但如果有人能夠至少將我指向正確的方向,我將不勝感激。

+0

我明白,承擔超出您的資格和利益的任務令人沮喪。不幸的是,這使得你的問題不適合這個網站,在這個網站中,用戶需要先或多或少地理解和研究自己的問題,然後以使問題和答案對其他開發人員有用的方式編寫,而不僅僅是他們自己。 –

+0

迭戈,爲什麼不嘗試幫助某人而不是把它們燒掉? – TedOnTheNet

+0

迭戈,像你這樣的態度的人讓我感到高興,我不需要經常這樣頻繁出現。指責我沒有研究什麼時候,實際上我研究了兩天,實在是太可笑了。我不記得拿着槍向你的頭求你幫助我。我想我已經很好地解釋了我的情況,以至於你的帖子既沒用也沒必要。 – user2453007

回答

0

這應該工作(未測試):

 var employee = session.CreateQuery(
      "from Employee emp1 where emp1.rsRank > " + 
      "(select min(emp2.rsRank) from Employee emp2 where emp2.Status = 'In' and emp2.rsRank > 0) " + 
      " order by emp1.rsRank") 
      .SetMaxResults(1) 
      .UniqueResult<Employee>(); 

或者,如果你需要的是排名,而不是員工,那麼你可以使用一個SQL查詢:

var rank = session.CreateSQLQuery("select top 1 emp2.rsRank from Employee emp2 where emp2.rsRank > (select min(emp2.rsRank) from Employee emp2) and emp2.Status='In'") 
        .UniqueResult<int>(); 
+0

完美的作品。謝謝! – user2453007

0

試試這個:

public Employee GetCurrentDesignatedRS() 
    { 
     using (ISession session = _nhHelper.OpenSession()) 
     { 
      var employee = session.CreateSQLQuery("select top 1 emp2.rsRank from Employee emp2 where emp2.rsRank > (select min(emp2.rsRank) from Employee emp2) and emp2.Status='In'").UniqueResult<Employee>(); 
      return employee; 
     } 
    }