我对此信息有一个看法:
TableA (IDTableA,IDTableB,IDTableC,有效,日期......)
对于TableA
中的每个寄存器以及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
中尝试此查询,则会收到错误消息,指出IDTableB
中的select
未包含在group
中{1}}条款。
我知道理论上SQLite中的第一个查询不应该起作用,但要做到这一点。
如何在SQL Server中执行此查询?
感谢。
答案 0 :(得分:2)
根据SQL 92,如果使用GROUP BY
子句,那么在SELECT
输出表达式列表中,您只能使用GROUP BY
列表中提到的列或任何其他列,但它们必须是包含在聚合函数中,如count()
,sum()
,avg()
,max()
,min()
和so on。
像MSSQL这样的服务器,Postgres严格遵守这条规则,但是例如MySQL和SQLite非常放松和宽容 - 这就是为什么它让你感到惊讶。
长话短说 - 如果你想在MSSQL中使用它,请遵守SQL92要求。
答案 1 :(得分:2)
SQL Server中的此查询
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
同样在SQL Server 2005中,您可以将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
答案 2 :(得分: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 强>