【问题标题】:Subquery in WHERE clauseWHERE 子句中的子查询
【发布时间】:2014-06-21 07:24:36
【问题描述】:

我目前正在使用 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 语法的问题?

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

【问题讨论】:

    标签: python mysql sql sqlalchemy subquery


    【解决方案1】:

    我还没有使用过 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)
    

    【讨论】:

    • 感谢您的建议。你记得我来看看不同类型的连接的定义。我一直在使用隐式内部连接,但显式使用它是个好主意。在尝试设置此查询时,我发现我在第二次尝试中遗漏了一个括号(请参阅我的原始帖子)。它现在正在工作。
    猜你喜欢
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 2020-12-31
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多