GROUP BY,ORDER BY并在LINQ中排名第一

时间:2018-06-22 08:51:29

标签: c# sql oracle linq oracle10g

假设我有一个包含两列的表:

TABLE A
-------
ProjectID           NUMBER
STATUS              VARCHAR2(6) // either 'CLOSED' or 'NEW'

ProjectID最多可以有两个条目,其中两个STATUS的可能值,并且组合(ProjectIDSTATUS)是唯一的。

我只需要选择状态为“ NEW”的ProjectID。另外,如果对于projectID,有两个状态不同的条目(NEW和CLOSED),我不希望它出现在输出中。

我尝试使用group by,然后将结果集降序排列(以便首先获得项目ID的“ NEW”行),然后进入LINQ中的第一行,类似于:

   var query = (from a in context.A.Where(o => o.STATUS == 'NEW')
               group a by a.ProjectID into groups
               select groups.OrderByDescending(o => o.ProjectID)
               .ThenBy(o => o.STATUS)
               .FirstOrDefault()); 

对接会导致查询中出现“ APPLY” clouse,从而导致错误。显然,Oracle 10g不支持它。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

正确使用having count(distinct STATUS=1)

create table tableA( ProjectID int, STATUS varchar2(10) );
insert all
  into tableA values(1    ,'NEW')
  into tableA values(1    ,'CHANGED')
  into tableA values(2    ,'NEW')
  into tableA values(3    ,'CHANGED')
select * from dual; 
/
select * from
(
select ProjectID, max(STATUS) STATUS
  from tableA
 group by ProjectID
having count(distinct STATUS)=1
)
where STATUS = 'NEW';

答案 1 :(得分:1)

也许是这样?

General Spinner.top = Picker Toolbar.bottom

答案 2 :(得分:0)

我相信我已经使用LINQ中的子查询完成了您想要的工作。

var query = (from a in context.A
                         where (from b in context.A
                                where b.ProjectID == a.ProjectID
                                select new { a.ProjectID, a.STATUS }).Distinct().Count() == 0
                                && a.STATUS == "NEW"
                         select a.ProjectID).ToList();

本质上,外部查询只是确保每个a记录都具有NEW状态,而内部查询则确保没有两个具有给定ProjectID的不同记录,因为如果有,一个是CLOSED。我避免使用GROUP BY,因为您说您的数据库不支持LINQ的方式。

我希望我正确理解了您的问题,希望对您有所帮助!