【发布时间】:2019-09-27 09:45:02
【问题描述】:
我正面临由 sqlalchemy 生成的查询的 oracle 错误 ORA-00928: missing SELECT keyword。这个问题已经被描述并回答了here。
我的查询看起来像:
WITH table2 (id) AS (
SELECT id
FROM table3
)
UPDATE table SET id=1
WHERE EXISTS (
SELECT *
FROM table
WHERE id IN (SELECT id FROM table2)
)
并由此生成:
table2 = session.query(table3.id).cte()
update(table).where(exists().where(table.id.in_(table2))).values(id=1)
现在我想知道如何告诉 sqlachemy 将 CTE 放在 WHERE 子句中,而不是在 UPDATE 之上。
UPDATE table SET id=1
WHERE EXISTS (
WITH table2 (id) AS (
SELECT id
FROM table3
)
SELECT *
FROM table
WHERE id IN (SELECT id FROM table2)
)
【问题讨论】:
-
您的两个更新声明对我来说都有意义。如果
table2中至少存在一行table,为什么要将table的所有ID 更新为1?这是你真正想要的还是像UPDATE table SET id=1 where id in ( SELECT id FROM table3 )这样简单的东西?如果这是您的意图,那么它根本没有理由生成 CTE。此外,您为什么不能简单地运行这样的更新而不是依赖 sqlalchemy 生成的内容? -
感谢您的回复。我只是创建了一个最小的示例以使其更易于理解。我的重点是将 WITH 子句移到 SELECT 子句之上。
-
@Hannes 希望有人可以为如何改变 SQLAlchemy 的工作方式提供答案,这将是最干净的解决方案。我对 SQLAlchemy 一无所知,但如果您找不到任何解决方法并且您必须使用现有 SQL,您可能需要查看 SQL Translation Framework。该工具允许我们将完全错误的查询转换为正确的语法。它用于将查询从 SQL Server 转换为 Oracle,但它也可以修复这样的错误。
标签: python database oracle sqlalchemy