-1

作为序言,我远非程序员。不幸的是,我的任务是修改一个使用 SQL 作为数据库的 ASP .NET 基于 Web 的输入板,该数据库是由我工作的公司的前雇员创建的。尽管不是程序员,但我的雇主似乎仍然想把这个扔给我,所以如果我太含糊,我很抱歉。

基本上,我需要修改以下函数中的 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')] 

我认为这是一个远射,但如果有人至少能指出我正确的方向,我将不胜感激。

4

2 回答 2

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;
        }
    }
于 2013-06-05T08:27:56.203 回答
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>();
于 2013-06-05T08:30:46.270 回答