Mysql jOOQ中派生表上的相关性
我有一个简单的父子表(一对多相关表)。下面是一个简单的例子,我在跟踪火车及其位置Mysql jOOQ中派生表上的相关性,mysql,sql,jooq,derived-table,Mysql,Sql,Jooq,Derived Table,我有一个简单的父子表(一对多相关表)。下面是一个简单的例子,我在跟踪火车及其位置 Table TRAIN - ID - NAME 每次列车到达车站时,将在列车状态中插入一条新的记录,记录相应的车站CD和到达时间(时间戳) 给定一个火车id,我想知道火车上最后一个已知的车站是什么: SQL解决方案:-使用派生表和相关子查询的组合 select t.ID, t.name, recent.STATION_CD from TRAIN t join ( select TR
Table TRAIN
- ID
- NAME
每次列车到达车站时,将在列车状态中插入一条新的记录,记录相应的车站CD和到达时间(时间戳)
给定一个火车id,我想知道火车上最后一个已知的车站是什么:
SQL解决方案:-使用派生表和相关子查询的组合
select t.ID, t.name, recent.STATION_CD
from TRAIN t
join (
select TRAIN_ID, STATION_CD
from TRAIN_STATUS ts
where ts.ARRIVAL_TIME = (
select MAX(ARRIVAL_TIME) from TRAIN_STATUS where TRAIN_STATUS.TRAIN_ID = ts.TRAIN_ID
)
) recent on t.ID=recent.TRAIN_ID
where t.ID = 1;
我无法用jOOQ拼凑出一个等价物。任何帮助都将不胜感激
编辑:方言是MySQL(5.7)。发布我自己的答案@LukasEder的建议。您可以使用以下分析函数简化sql解决方案,并在jooq中使用:
select ID, name, station_cd from
(select t.ID, t.name, ts.STATION_CD,
row_number() over (partition by t.TRAIN_ID order by ts.ARRIVAL_TIME desc) as rn
from train t join TRAIN_STATUS ts on t.TRAIN_ID = ts.TRAIN_ID) t
where rn = 1
TrainStatus ts=列车状态,如“ts”);
选择ConditionStep lastArrivalTime=dslContext
.选择(最大值(列车状态、到达时间))
.从(列车状态)
.其中(列车状态、列车ID、eq(st列车ID));
表最近=dslContext
.选择(ts.字段(列车状态.列车ID),ts.字段(列车状态.列车CD))
.来自(ts)
.where(ts.field(列车状态、到达时间)、eq(最后到达时间))
.不稳定(“最近”);
返回上下文
.选择(
列车识别号(“ID”),
最近状态字段(列车状态CD).as(“最近状态代码”)
)
.从(火车)
.join(最近).on(TRAIN.TRAIN\u ID.eq(最近.字段(TRAIN\u STATUS.TRAIN\u ID)))
.其中(列ID.eq(1))
.fetchOneInto(TrainStatusModel.class);
请标记您正在使用的数据库,如SQL server、Oracle、MySql等。我需要在jOOQ中解决这个问题,如原始帖子中所述。谢谢您的建议。@Keerthi:在大多数RDBMS中,有比您计划的方式更好的解决方法(即避免2x访问TRAIN\u STATUS
表)。所以,张贴方言肯定会提供更好的答案。。。您尝试过什么jOOQ查询?“你为什么失败了?”卢卡塞德说,我简直无法思考,也无法用约克的话说解决问题。但那是昨天。我又打了一枪,打得很好。把它贴在原来的帖子里。我知道这个解决方案可能不是最理想的,但我故意希望它基于派生表和相关子查询-你知道我现在正在学习如何使用它们:)当然,我很想听到解决这个问题的最佳方法。@Keerthi:有意义。您知道,您可以在这里提供有关堆栈溢出的问题的答案。这样,对于这个问题的未来访问者来说,在这里跟踪您的进度和解决方案可能会更容易。对于MySQL 5.7,不支持分析函数和其他方法,我认为您已经找到了最好的方法。谢谢。当我掌握了分析函数后,我将重新讨论这个问题(并尝试在jOOQ中进行讨论)。
select ID, name, station_cd from
(select t.ID, t.name, ts.STATION_CD,
row_number() over (partition by t.TRAIN_ID order by ts.ARRIVAL_TIME desc) as rn
from train t join TRAIN_STATUS ts on t.TRAIN_ID = ts.TRAIN_ID) t
where rn = 1
TrainStatus ts = TRAIN_STATUS.as("TS");
SelectConditionStep<Record1<LocalDateTime>> lastArrivalTime = dslContext
.select(max(TRAIN_STATUS.ARRIVAL_TIME))
.from(TRAIN_STATUS)
.where(TRAIN_STATUS.TRAIN_ID.eq(st.TRAIN_ID));
Table<Record2<Long, String>> recent = dslContext
.select(ts.field(TRAIN_STATUS.TRAIN_ID), ts.field(TRAIN_STATUS.STATUS_CD))
.from(ts)
.where(ts.field(TRAIN_STATUS.ARRIVAL_TIME).eq(lastArrivalTime))
.asTable("recent");
return dslContext
.select(
TRAIN.TRAIN_ID.as("id"),
recent.field(TRAIN_STATUS.STATUS_CD).as("recent_status_code")
)
.from(TRAIN)
.join(recent).on(TRAIN.TRAIN_ID.eq(recent.field(TRAIN_STATUS.TRAIN_ID)))
.where(TRAIN.ID.eq(1))
.fetchOneInto(TrainStatusModel.class);