Python WHERE子句中的子查询
我目前正在使用sqlalchemy运行以下查询Python WHERE子句中的子查询,python,mysql,sql,sqlalchemy,subquery,Python,Mysql,Sql,Sqlalchemy,Subquery,我目前正在使用sqlalchemy运行以下查询 SELECT * FROM qsreport_test.JiraFehlerFreigabeReleaseTestData a WHERE a.dtime = ( SELECT max(dtime) FROM qsreport_test.JiraFehlerFreigabeReleaseTestData b WHERE b.key=a.key
SELECT *
FROM
qsreport_test.JiraFehlerFreigabeReleaseTestData a
WHERE a.dtime = (
SELECT
max(dtime)
FROM
qsreport_test.JiraFehlerFreigabeReleaseTestData b
WHERE
b.key=a.key
AND
b.testplanname=a.testplanname
AND
b.priority=a.priority
)
GROUP BY
a.testplanname, a.priority
我在这里搜索,找到了我也知道
但我仍然无法让我的查询正常工作 以下是我的两次尝试。可以执行第一个查询,但不会给出与手动执行的查询相同的结果。第二个可以执行,现在正在工作(以前缺少括号) 尝试1:
subq = session.query(JiraFehlerFreigabeReleaseTestData.key, JiraFehlerFreigabeReleaseTestData.testplanname, JiraFehlerFreigabeReleaseTestData.priority, func.max(JiraFehlerFreigabeReleaseTestData.dtime).label('max_dtime')).filter(JiraFehlerFreigabeReleaseTestData.key == key).filter(JiraFehlerFreigabeReleaseTestData.dtime <= dtime).subquery()
res = session.query(JiraFehlerFreigabeReleaseTestData).filter(and_(JiraFehlerFreigabeReleaseTestData.key == subq.c.key, JiraFehlerFreigabeReleaseTestData.testplanname == subq.c.testplanname, JiraFehlerFreigabeReleaseTestData.priority == subq.c.priority, JiraFehlerFreigabeReleaseTestData.dtime == subq.c.max_dtime)).group_by(JiraFehlerFreigabeReleaseTestData.testplanname).order_by(JiraFehlerFreigabeReleaseTestData.dtime.desc()).all()
请告诉我我做错了什么。我的问题是我不完全理解如何在子查询中引用主查询的表。特别是这两个表在两个查询中都是相同的。也许有什么问题需要将我的手动sql查询转换为sqlalchemy orm语法
编辑:
我的第二个版本正在运行。我只是少了一个妄想症。我修正了上面的代码。
但是为什么我的第一次尝试给了我一个不同的结果呢?我还没有使用SQLAlchemy,但是如果您的arn不使用子查询,也许您可以解决您的问题。看看下面的查询。未测试您的免费翻译版本;)
谢谢你的建议。你记得让我看一看不同类型联接的定义。我总是使用隐式内部联接,但显式使用它是个好主意。在尝试设置此查询时,我发现我的secsond try中缺少了一个偏执(请参阅我的原始帖子)。它现在正在工作。
b = aliased(JiraFehlerFreigabeReleaseTestData, name='b')
res = session.query(JiraFehlerFreigabeReleaseTestData).filter(JiraFehlerFreigabeReleaseTestData.dtime == (session.query(func.max(b.dtime)).filter(b.key == JiraFehlerFreigabeReleaseTestData.key).filter(b.testplanname == JiraFehlerFreigabeReleaseTestData.testplanname).filter(b.priority == JiraFehlerFreigabeReleaseTestData.priority))).group_by(JiraFehlerFreigabeReleaseTestData.testplanname,JiraFehlerFreigabeReleaseTestData.priority).order_by(JiraFehlerFreigabeReleaseTestData.dtime.desc()).all()
SELECT a.*
FROM qsreport_test.JiraFehlerFreigabeReleaseTestData a
INNER JOIN qsreport_test.JiraFehlerFreigabeReleaseTestData b
ON b.key = a.key
AND b.testplanname=a.testplanname
AND b.priority=a.priority
GROUP BY a.testplanname, a.priority
HAVING a.dtime = max(b.dtime)