【发布时间】:2012-05-06 15:30:19
【问题描述】:
我有两个如下形式的表格(即每个 foo 都链接到一个栏)。
CREATE TABLE foo (
id INTEGER PRIMARY KEY,
x INTEGER NOT NULL,
y INTEGER NOT NULL,
...,
bar_id INTEGER UNIQUE NOT NULL,
FOREIGN key (bar_id) REFERENCES bar(id)
);
CREATE TABLE bar (
id INTEGER PRIMARY KEY,
z INTEGER NOT NULL,
...
);
使用嵌套查询可以轻松复制foo 中满足特定条件的行:
INSERT INTO foo (...) (SELECT ... FROM foo WHERE ...)
但我不知道如何为foo 中的每一行复制bar 中的关联行并将bar 的ID 插入新的foo 行。有没有办法在单个查询中做到这一点?
期望结果的具体例子:
-- Before query:
foo(id=1,x=3,y=4,bar_id=100) ..... bar(id=100,z=7)
foo(id=2,x=9,y=6,bar_id=101) ..... bar(id=101,z=16)
foo(id=3,x=18,y=0,bar_id=102) ..... bar(id=102,z=21)
-- Query copies all pairs of foo/bar rows for which x>3:
-- Originals
foo(id=1,x=3,y=4,bar_id=101) ..... bar(id=101,z=7)
foo(id=2,x=9,y=6,bar_id=102) ..... bar(id=102,z=16)
foo(id=3,x=18,y=0,bar_id=103) ..... bar(id=103,z=21)
-- "Copies" of foo(id=2,...) and foo(id=3,...), with matching copies of
-- bar(id=102,...) and bar(id=103,...)
foo(id=4,x=9,y=6,bar_id=104) ..... bar(id=104,z=16)
foo(id=5,x=18,y=0,bar_id=105) ..... bar(id=105,z=21)
【问题讨论】:
-
您是否查看过带有插入规则的可更新视图? archives.postgresql.org/pgsql-admin/2006-05/msg00290.php
-
bar.z的值是否唯一? -
嗯,谢谢你的额外回答。我想不可能在单个查询中以任何一般方式执行此操作。
-
为什么这么说?我提供了相反的证据。
-
嗯,有一个简单的解释。我在您添加答案的链接之前说过,它并不假定“z”是唯一的:) 但是,似乎唯一实用的解决方案是合并这两个表,但是,正如您所建议的那样。
标签: sql postgresql insert common-table-expression