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