根据您的头像和描述,我猜您正在使用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, existsstmt = 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)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)