2

我对此信息有一个看法:

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

对于 in 中的每个寄存器TableA和 in 中的每个寄存器tableC,我希望该寄存器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收到一个错误,指出IDTableBinselect不包含在group子句中。

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

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

谢谢。

4

3 回答 3

2

根据 SQL 92,如果使用GROUP BY子句,则在SELECT输出表达式列表中,您只能使用列表中提到的GROUP BY列,或任何其他列,但它们必须包装在聚合函数中,如count(), sum(), avg(),等max()min()

一些服务器,如 MSSQL、Postgres 对此规则非常严格,但例如 MySQL 和 SQLite 则非常宽松和宽容——这就是它让你感到惊讶的原因。

长话短说 - 如果您希望它在 MSSQL 中工作,请遵守 SQL92 要求。

于 2013-02-09T09:49:51.313 回答
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;

或者

同样在 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
于 2013-02-09T10:44:53.147 回答
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 演示

于 2013-02-09T09:49:39.120 回答