2013-02-09 34 views
2

我有这个信息的视图:T-SQL,如何通过查询来完成这个组?

表A(IDTableA,IDTableB,IDTableC,活动,日期,...)

对于每一个注册在TableAtableC每个寄存器,我想要tableB有最大日期和有效的注册。

select IDTableA, IDtableC, IDTableB, Date, Active 
from myView 
where Active = 1 
group by IDTableA, IDTableC 
Having Max(Date) 
order by IDTableA; 

此查询的工作与SQLite,但如果我尝试在SQL Server此查询我得到那个说IDTableBselect未包含在group子句中的错误。

我知道理论上SQLite中的第一个查询不应该工作,但是要这样做。

如何在SQL Server中执行此查询?

谢谢。

+0

包括它的'GROUP BY'子句。什么'HAVING MAX(日期)'等于什么,到底是什么? – 2013-02-09 09:41:14

+0

这是用于SQL Server还是用于SQLite? – 2013-02-09 10:47:50

回答

1

试试这个,

select * from table1 b 
where active = 1 
and date = (select max(date) from table1 
      where idtablea = b.idtablea 
      and idtablec = b.idtablec 
      and active = 1); 

SQLFIDDLE DEMO

+0

没有必要放置一个“GROUP BY”条件来获得所需的结果。 – Orangecrush 2013-02-09 10:28:49

+0

这是仅使用视图还是我必须使用三个表? – 2013-02-09 10:44:56

+0

@ÁlvaroGarcía这只是使用视图。将'table1'替换为'TableA'(我假设它是你的视图的名字)。 – Orangecrush 2013-02-09 10:46:53

2

根据SQL 92,如果你使用GROUP BY条款,然后在SELECT输出表达式列表中,您只能使用GROUP BY列表中提及的列,或任何其他栏目,但它们必须包装在聚合函数中,如count()sum(),avg(),max(),min()so on

一些像MSSQL,Postgres这样的服务器严格遵守这个规则,但是例如MySQL和SQLite都非常轻松和宽容 - 这就是为什么它让你感到惊讶。

长话短说 - 如果你想在MSSQL中工作,坚持SQL92的要求。

2

该查询SQLServer中

select IDTableA, IDtableC, IDTableB, Date, Active 
from myView v1 
where Active = 1 
    AND EXISTS (
       SELECT 1 
       FROM myView v2 
       group by v2.IDTableA, v2.IDTableC 
       Having Max(v2.Date) = v1.Date 
      ) 
order by v1.IDTableA; 

OR

此外,在SQLServer2005的+,你可以使用CTE与ROW_NUMBER

;WITH cte AS 
(    
    select IDTableA, IDtableC, IDTableB, [Date], Active, 
     ROW_NUMBER() OVER(PARTITION BY IDTableA, IDTableC ORDER BY [Date] DESC) AS rn 
    from myView v1 
    where Active = 1 
) 
    SELECT * 
    FROM cte 
    WHERE rn = 1 
    ORDER BY IDTableA