python - 无法将此 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)))
解决方案
我不是 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 版本。
推荐阅读
- angular - 多阶段表单验证角度
- node.js - Typescript node.js 可以从界面打印密钥吗?
- java - 使用模数和整数除法来确认帐号
- oracle - 我怎样才能找到收入比他们的经理少的员工?- ORACLE - SCOTT 数据库
- javascript - 无论 Javascript 的输入值如何,第一行(动态生成)始终显示
- python - TypeError: 'float object is not subscriptable from Machine Learning with Python for Everyone by Mark Fenner
- java - InputMismatchException Java第一个扫描仪工作第二个不
- jquery - 在 Webpacker 5 中加载 jQuery 的问题
- ssl - Heroku ACM 失败(未返回 HTTP 质询)
- robolectric - android unittest得到了instrument.IllegalClassFormatException,为什么它抱怨“(有Java 1)。”?