You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Sql Kata中实现Cross Apply查询?求替代方案

SqlKata中实现Cross Apply逻辑的替代方案

SqlKata目前没有原生支持Cross Apply的API,但可以通过以下两种方式实现和目标SQL等价的逻辑:

方案一:使用Raw方法直接嵌入原生SQL片段

这是最直接的方式,完全贴合你目标SQL的逻辑,适合仅针对支持Cross Apply的数据库(如SQL Server)开发的场景:

var query = new Query("Test1 as t1")
    .Raw("cross apply (select top 1 t2.OperationalStopID from Test2 t2 where t2.LegID = t1.LegID order by t2.SequenceNumber desc) t3")
    .Select("*");

生成的SQL会和你期望的完全一致,缺点是失去了SqlKata的跨数据库兼容性。

方案二:用窗口函数+关联查询改写逻辑

如果需要更好的跨数据库兼容性,可以用ROW_NUMBER()窗口函数替代Cross Apply中的TOP 1子查询,再通过内连接关联主表,实现等价逻辑:

步骤1:构建获取每组最新记录的子查询

var latestStopQuery = new Query("Test2")
    .Select("LegID", "OperationalStopID")
    .SelectRaw("ROW_NUMBER() OVER (PARTITION BY LegID ORDER BY SequenceNumber DESC) AS rn")
    .Where("rn", 1);

步骤2:关联主表实现查询

var query = new Query("Test1 as t1")
    .Join(latestStopQuery.As("t3"), j => j.On("t1.LegID", "t3.LegID"))
    .Select("t1.*", "t3.OperationalStopID");

如果需要实现OUTER APPLY的等价逻辑,只需把Join替换为LeftJoin即可。

内容的提问来源于stack exchange,提问作者Lio Liov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 13:25:40