WHERE子句中的子查询

时间:2014-06-21 07:24:37

标签: 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 
    AND 
        b.testplanname=a.testplanname 
    AND 
        b.priority=a.priority
) 
GROUP BY 
    a.testplanname, a.priority

我在这里搜索并找到了 SQLAlchemy - subquery in a WHERE clause
而且我也知道 http://docs.sqlalchemy.org/en/rel_0_9/orm/tutorial.html#using-subqueries
但我仍然没有让我的查询工作。

以下是我的两次尝试。第一个可以执行,但不会给我与手动执行查询相同的结果。第二个可以执行,现在正在工作(之前没有括号)。

尝试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()

尝试2:

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()

请告诉我我做错了什么。我的问题是我不完全理解如何在子查询中引用主查询的表。特别是因为两个表在两个查询中都是相同的。也许有什么东西可以将我的手动sql查询转换为sqlalchemy orm语法?

编辑: 我的第二个版本正在运行。我只是缺少一个paranthesis。我修改了上面的代码。 但为什么我的第一次尝试给我一个不同的结果?

1 个答案:

答案 0 :(得分:0)

我还没有使用SQLAlchemy,但如果您使用子查询,也许您可​​以解决您的问题。看看下面的查询。没有测试过您的免费翻译;)

    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)