我有一张表格,其中包含多个地点之间机器移动的记录。
由于我只在列表中显示最新版本,因此我只读取了每台机器最新记录日期的数据行,直到现在为止。
Select *
From records
INNER JOIN
(Select max(processdate) as maxDate, machinetag, machineno
from records
group by machinetag, machineno ) as lrcd
on records.machineTag = lrcd.machineTag and records.machineno = lrcd.machineno
and records.processDate = lrcd.maxDate
我看过很多帖子,但我找不到任何解决方案。
如何使用queryover实现此方案?
很提前你很开心。 的Sascha答案 0 :(得分:0)
内部联接几乎总是可以重写为where子句和投影的组合。
像这样的东西(我在没有编译器的情况下写作,对不起,如果有任何错误):
Select
records.*,
(select max(processdate) as maxdate
from records
where lrcd.machineno = records.machineno)
-- add more projections if you need them
From records
where records.processDate =
(select max(processdate) as maxDate
from records
where lrcd.machineno = records.machineno) as lrcd
现在使用QueryOver很容易实现(子查询可以在投影或限制中实现)。
不要担心重复的代码 - 查询计划会为您优化它。
答案 1 :(得分:0)
此语句表示没有内部联接的语句:
Select r.*
from records as r
where r.processDate =
(Select max(processdate) as maxDate
from records as lr
where lr.machinetag = r.machinetag and
lr.machineno = r.machineno)
答案 2 :(得分:0)
现在我可以提供(可能)工作解决方案:
Dim r As Record = Nothing
Dim subquery = QueryOver.Of(Of Record)() _
.Where(Function(rec) rec.R_MachineTag = r.R_MachineTag) _
.And(Function(rec) rec.R_MachineNo = r.R_MachineNo) _
.Select(Projections.Max(Of Record)(Function(rec) rec.R_ProcessDate)).Take(1)
Dim query = session.QueryOver(Function() r) _
.WithSubquery.WhereProperty(Function(rec) rec.R_ProcessDate).Eq(subquery) _
.List()
感谢cbp给我提示;)