Postgresql 在sqlalchemy中,在有序子查询上与一个DISTINCT连接

Postgresql 在sqlalchemy中,在有序子查询上与一个DISTINCT连接,postgresql,sqlalchemy,subquery,Postgresql,Sqlalchemy,Subquery,这是我的问题的一个极其简化的版本 我正在使用Postgresql作为后端,并尝试构建一个sqlalchemy查询 来自另一个查询 表格设置 下面是一些随机数据的表格。 您可以假设每个表都是在sqlalchemy中声明的,带有 映射程序的名称分别为Item和ItemVersion。 在问题的末尾,你可以找到一个链接,我把代码放在那里 此问题中的所有内容,包括表定义 一些项目 item +----+ | id | +----+ | 1 | | 2 | | 3 | +----+ 包含每个项目版

这是我的问题的一个极其简化的版本

我正在使用Postgresql作为后端,并尝试构建一个sqlalchemy查询 来自另一个查询

表格设置 下面是一些随机数据的表格。 您可以假设每个表都是在sqlalchemy中声明的,带有 映射程序的名称分别为Item和ItemVersion。 在问题的末尾,你可以找到一个链接,我把代码放在那里 此问题中的所有内容,包括表定义

一些项目

item
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
+----+
包含每个项目版本的表。每个都至少有一个

item_version
+----+---------+---------+-----------+
| id | item_id | version | text      |
+----+---------+---------+-----------+
|  1 |       1 |       0 | item_1_v0 |
|  2 |       1 |       1 | item_1_v1 |
|  3 |       2 |       0 | item_2_v0 |
|  4 |       3 |       0 | item_3_v0 |
+----+---------+---------+-----------+
询问 现在,对于给定的sqlalchemy项查询,我需要一个返回 另一个查询,但这次是项,ItemVersion,其中包含项 与原始查询中的顺序相同!,这家公司在哪里 ItemVersion是每个项目对应的最新版本

下面是一个SQL示例,非常简单:

首先,对item表进行随机查询

选择item.id作为item\u id 从项目 其中item.id!=2. 按项目订购。id描述 对应于

+---------+
| item_id |
+---------+
|       3 |
|       1 |
+---------+
然后通过这个查询,如果我想加入正确的版本,我可以这样做

选择sq2.item_id作为item_id, sq2.item_version_id作为item_version_id, sq2.item_version_text作为item_version_text 从…起 在sq.item_id上选择DISTINCT sq.item_id作为item_id, iv.id作为项目\版本\ id, iv.文本作为项目\版本\文本 从…起 选择item.id作为item\u id 从项目 身份证在哪里!=2. 按id描述为sq的订单 将项目_版本加入为iv 在iv.item_id=sq.item_id上 按sq.item_id订购,iv.version DESC为sq2 按sq2订购。项目标识说明 现在的挑战是在sqlalchemy中编写一个这样做的函数。 这是我到目前为止所拥有的

首先是对项目的初始sqlalchemy查询:

session.queryItem.filterItem.id!=2.order_bydescItem.id 然后,我可以构建第二个查询,但不需要原始排序。在里面 换句话说,我不知道如何完成我在中完成的第二个子查询包装 SQL以获取上的DISTINCT放弃的顺序

def join_版本会话,查询: sq=aliasedItem,query.subquery'sq' sq2=session.querysq,ItemVersion\ .distinctsq.id\ .joinItemVersion\ .order_bysq.id,descItemVersion.version 返回sq2 我想这可能是答案的一部分,但我不太清楚 当然可以

运行此问题中所有内容的代码数据库创建、填充和 到目前为止,我的单元测试失败了。正常地
如果您可以修复join_version函数,它应该可以通过测试

好吧,我找到了一个方法。这是一个有点黑客,但仍然只查询数据库两次,所以我想我会活下来!基本上,我首先查询数据库中的项,然后再查询ItemVersions,过滤item_id,然后

代码如下:

def join_版本会话,查询: items=query.all item_id=[items中i的i.id] items\u v\u sq=session.queryItemVersion\ .DistrictItemVersion.item\u id\ .filterItemVersion.item\u id.in\u item\u id\ .order_byItemVersion.item_id,descItemVersion.version\ .子查询'sq' sq=别名编辑版本,项目为sq items\u v=session.querysq\ .order_by'idxarray{},sq.item_id'。formatitem_id 返回zipitems、items\u v