[英]Is it possible to join a table with itself twice? (Using SQLAlchemy or SQL)
[英]SQLAlchemy query shows error “Can't join table/selectable 'workflows' to itself”
我写了一个SQL查询,我正在尝试移植到SQLAlchemy,但收到以下错误:
sqlalchemy.exc.InvalidRequestError: Can't join table/selectable 'workflows' to itself
SQL(工作):
SELECT
w.user_id, COUNT(l.id)
FROM
logs as l
INNER JOIN
workflows as w
ON l.workflow_id = w.id
WHERE
l.type = 's'
AND l.timestamp > extract(epoch from now()) - 86400
GROUP BY
w.user_id;
SQLAlchemy(不工作):
session.query(
Workflow.user_id, func.count(Log.id)
).join(
Workflow, Workflow.id == Log.workflow_id
).filter(
Log.type == 's', Log.timestamp > time.time() - 86400
).group_by(
Workflow.user_id
).all()
这是预期的输出:
+----------+---------+
| user_id | count |
+----------+---------+
| 1 | 5 |
| 2 | 10 |
+----------+---------+
我究竟做错了什么?
部分
.query(Workflow.user_id, func.count(Log.id))
将Workflow
和Log
添加到您的查询中。 第一个模型标记为主表,其他模型标记为辅助表。 如果之后没有调用.join()
,则主表和辅助表都将添加到FROM
子句中。 如果调用.join()
它会将它接收的表移动到JOIN
子句。 这里重要的是.join()
只能应用于辅助表。
问题是你的电话
.join(Workflow, Workflow.id == Log.workflow_id)
尝试将主表标记为已连接。 要解决问题,您需要加入辅助表:
.join(Log, Workflow.id == Log.workflow_id)
您可以添加echo=True
以查看SQLAlchemy生成的SQL。 调试查询非常方便。 或者您可以编译单个查询以查看生成的SQL。
如前所述,查询的主要实体是Workflow
,因此连接尝试将Workflow
连接到自身,这是不可能的,至少在没有使用别名的情况下是这样。
除了简单地重新排序连接之外,您还可以使用Query.select_from()
显式控制连接的左侧:
session.query(
Workflow.user_id, func.count(Log.id)
).select_from(
Log
).join(
Workflow, Workflow.id == Log.workflow_id
).filter(
Log.type == 's', Log.timestamp > time.time() - 86400
).group_by(
Workflow.user_id
).all()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.