根据您的头像和描述,我猜测您正在使用Oracle。从
这个答案中可以得出以下SQLAlchemy组合,如果您的连接结果是
保留键视图:
stmt = select([foo.c.bar.label('foo_bar'),
foo.c.baz.label('foo_baz'),
foobar.c.bar.label('foobar_bar'),
foobar.c.baz.label('foobar_baz')]).\
where(foo.c.id == foobar.c.id)
update(stmt).values({stmt.c.foo_bar: stmt.c.foobar_bar,
stmt.c.foo_baz: stmt.c.foobar_baz})
这会产生以下SQL语句:
UPDATE (SELECT foo.bar AS foo_bar,
foo.baz AS foo_baz,
foobar.bar AS foobar_bar,
foobar.baz AS foobar_baz
FROM foo, foobar
WHERE foo.id = foobar.id)
SET foo_bar=foobar_bar, foo_baz=foobar_baz
标签很重要,因为您的表共享列名。
您还可以生成原始目标SQL:
from sqlalchemy import tuple_, select, exists
stmt = select([foobar.c.bar, foobar.c.baz]).where(foo.c.id == foobar.c.id)
foo.update().\
values({tuple_(foo.c.bar, foo.c.baz).self_group(): stmt}).\
where(exists(stmt))
self_group()
方法非常重要,因为编译器似乎会忽略元组周围的括号,在这种情况下会产生错误的语法。我添加了WHERE子句以避免更新没有匹配的foobar行中的foo行:
UPDATE foo SET (bar, baz)=(SELECT foobar.bar, foobar.baz
FROM foobar
WHERE foo.id = foobar.id) WHERE EXISTS (SELECT foobar.bar, foobar.baz
FROM foobar
WHERE foo.id = foobar.id)