【问题标题】:Sub Select in OdataOdata中的子选择
【发布时间】:2015-07-21 14:39:43
【问题描述】:

我正在寻找一种使用 Odata 创建子选择/子查询的方法。我要创建的查询应如下所示:

SELECT * 
FROM Treatment
WHERE status = 'Pos'
and ID IN ( 
    SELECT FIRST(ID)
    FROM Treatment
    WHERE TreatmentTypeSK = 9
    GROUP BY Person, TreatmentTypeSK
    ORDER BY Date DESC
)

作为我想要完成的示例,请查看以下数据。

ID    Person    TreatmentTypeSK    Status    Date
----------------------------------------------------
1     Bob       9                  Pos       1/5/15
2     Bob       9                  Neg       2/10/15
3     Jane      9                  Pos       1/20/15
4     Jane      9                  Neg       1/1/15
5     Jane      8                  Pos       3/2/15

使用上面的查询(我希望使用 odata 生成),唯一会返回的结果是 ID 3,因为它是 Jane 的最新处理记录,TreatmentTypeSK 为 9,状态为“Pos”。请注意,不会返回 ID 2,因为即使 Bob 有几条 TreatmentTypeSK 9 的记录,最新的一条没有“Pos”状态。

【问题讨论】:

    标签: c# subquery odata sql-subselect


    【解决方案1】:

    像这样的子查询不适用于 Odata,您必须进行 2 次查询,但我认为您有更大的问题,因为我认为子查询本身是不可能的。

    我认为虽然在 OData 规范中使用此链接中提到的 group by 在技术上可能实现这一点:http://docs.oasis-open.org/odata/odata-data-aggregation-ext/v4.0/cs01/odata-data-aggregation-ext-v4.0-cs01.html#_Toc378326290

    我认为大多数库都不支持此功能,因此您可能难以实际使用它。我在 TripPin 上试了一下,还是不行……

    我可能会将这个功能公开为一个 odata 函数,或者(有点混乱),将查询更改为不按部分分组 - 这也将消除对子查询的需要。问题是你可以每人获得多行,但你可以在客户端上发布处理。

    【讨论】:

    • 谢谢汤姆。我见过你提到的 $orderby 功能。然而,这还不是最大的担忧。我真的在寻找有关上面查询中显示的子查询的一些指导。
    • 对不起,我没有把自己说清楚,我已经编辑了答案,希望能更清楚一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多