首页 > 解决方案 > 无法将此 SQL 字符串(带有 VALUES ... AS)转换为 SQLAlchemy 代码

问题描述

我拥有的 SQL 查询可以Max从它连接在一起的 3 个表中识别编辑时间:

Select Identity.SSN, Schedule.First_Class, Students.Last_Name,
(SELECT Max(v)
    FROM (VALUES (Students.Edit_DtTm), (Schedule.Edit_DtTm),
    (Identity.Edit_DtTm)) AS value(v)) as [MaxEditDate]
FROM Schedule
LEFT JOIN Students ON Schedule.stdnt_id=Students.Student_Id
LEFT JOIN Identity ON Schedule.std_id=Identity.std_id

我需要将其放在 SQLAlchemy 中,以便可以引用代码中其他地方使用的列。下面是我正在尝试做的最简单的版本,但它不起作用。我尝试改变查询它的方式,但是我得到一个我使用VALUES不正确的 SQL 错误,或者它没有正确连接,并且在没有将其与外部查询匹配的情况下获得这些列中的实际最大值

max_edit_subquery = sa.func.values(Students.Edit_DtTm, Schedule.Edit_DtTm, Identity.Edit_DtTm)
base_query = (sa.select([Identity.SSN, Schedule.First_Class, Students.Last_Name,
                            (sa.select([sa.func.max(self.max_edit_subquery)]))]).
                            select_from(Schedule.__table__.join(Students, Schedule.stdnt_id == Students.stdnt_id).
                            join(Ident, Schedule.std_id == Identity.std_id)))

标签: pythonsqlsqlalchemy

解决方案


我不是 SQLAlchemy 的专家,但您可以VALUES交流UNION ALL

Select Identity.SSN, Schedule.First_Class, Students.Last_Name,
(SELECT Max(v)
    FROM (SELECT Students.Edit_DtTm AS v
         UNION ALL SELECT Schedule.Edit_DtTm
         UNION ALL SELECT Identity.Edit_DtTm) s
   ) as [MaxEditDate]
FROM Schedule
LEFT JOIN Students ON Schedule.stdnt_id=Students.Student_Id
LEFT JOIN Identity ON Schedule.std_id=Identity.std_id;

另一种方法是使用GREATEST函数(在 T-SQL 中不可用):

Select Identity.SSN, Schedule.First_Class, Students.Last_Name,
    GREATEST(Students.Edit_DtTm, Schedule.Edit_DtTm,Identity.Edit_DtTm)
    as [MaxEditDate]
FROM Schedule
LEFT JOIN Students ON Schedule.stdnt_id=Students.Student_Id
LEFT JOIN Identity ON Schedule.std_id=Identity.std_id;

我希望它能帮助您将其翻译成 ORM 版本。


推荐阅读