前言,我远离程序员。遗憾的是,我的任务是使用SQL作为由我工作的公司的前雇员创建的数据库来修改基于ASP .NET网络的输入板。尽管不是程序员,我的雇主似乎仍然想把它扔给我,所以如果我太模糊,我会道歉。
基本上,我需要在以下函数中修改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)
试试这个:
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;
}
}
答案 1 :(得分: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>();