postgresql 在单个查询中更新多个表
postgresql update multiple tables in single query
我有 2 个表格如下:
serial_table
id CHARACTER VARYING(20),
serial_key CHARACTER VARYING(20),
PRIMARY KEY(id, serial_key)
serial_rate:
id CHARACTER VARYING(20),
serial_key CHARACTER VARYING(20),
rate NUMERIC,
PRIMARY KEY(id, serial_key),
FOREIGN KEY (id, serial_key) REFERENCES serial_table(id, serial_key)
现在我想从单个 SQL 查询更新 serial_rate.rate
和 serial_table.serial_key
,例如:
UPDATE inventory.serial_table AS s
JOIN inventory.serial_rate AS r
ON (s.id, s.serial_key) = (r.id, r.serial_key)
SET s.serial_key = '0002', r.rate = 22.53
WHERE (s.id, s.serial_key) = ('01', '002');
我知道这是不正确的。 有没有办法做到这一点 因为我想使用语句在 Java 中创建一个 PreparedStatement
?
编辑
这个问题不是关于 Java 中的 PreparedStatements
它是关于我希望在创建 PreparedStatement
时作为参数传递的 SQL 语法。 我不想要关于 PreparedStatement
的任何答案。
这是 CTE 的东西(但我不知道如何将它包装成准备好的 Java-东西)
WITH src AS (
UPDATE serial_rate
SET rate = 22.53, serial_key = '0002'
WHERE serial_key = '002' AND id = '01'
RETURNING *
)
UPDATE serial_table dst
SET serial_key = src.serial_key
FROM src
-- WHERE dst.id = src.id AND dst.serial_key = '002'
WHERE dst.id = '01' AND dst.serial_key = '002'
;
这是 a_horse_with_no_name 在 sqlfiddle.com 上发布的内容:
WITH id_values (new_key, old_key, id) as (
values ('0002', '002', '01')
), src AS (
UPDATE serial_rate
SET rate = 22.53,
serial_key = (select new_key from id_values)
WHERE serial_key = (select old_key from id_values)
AND id = (select id from id_values)
RETURNING *
)
UPDATE serial_table dst
SET serial_key = src.serial_key
FROM src
WHERE dst.id = (select id from id_values)
AND dst.serial_key = (select old_key from id_values)
;
这实际上是 wildplasser 发布的内容的修改版本,作为对我关于 serial_key
字段是否可以使用一次的查询的回复。
我有 2 个表格如下:
serial_table
id CHARACTER VARYING(20), serial_key CHARACTER VARYING(20), PRIMARY KEY(id, serial_key)
serial_rate:
id CHARACTER VARYING(20), serial_key CHARACTER VARYING(20), rate NUMERIC, PRIMARY KEY(id, serial_key), FOREIGN KEY (id, serial_key) REFERENCES serial_table(id, serial_key)
现在我想从单个 SQL 查询更新 serial_rate.rate
和 serial_table.serial_key
,例如:
UPDATE inventory.serial_table AS s
JOIN inventory.serial_rate AS r
ON (s.id, s.serial_key) = (r.id, r.serial_key)
SET s.serial_key = '0002', r.rate = 22.53
WHERE (s.id, s.serial_key) = ('01', '002');
我知道这是不正确的。 有没有办法做到这一点 因为我想使用语句在 Java 中创建一个 PreparedStatement
?
编辑
这个问题不是关于 Java 中的 PreparedStatements
它是关于我希望在创建 PreparedStatement
时作为参数传递的 SQL 语法。 我不想要关于 PreparedStatement
的任何答案。
这是 CTE 的东西(但我不知道如何将它包装成准备好的 Java-东西)
WITH src AS (
UPDATE serial_rate
SET rate = 22.53, serial_key = '0002'
WHERE serial_key = '002' AND id = '01'
RETURNING *
)
UPDATE serial_table dst
SET serial_key = src.serial_key
FROM src
-- WHERE dst.id = src.id AND dst.serial_key = '002'
WHERE dst.id = '01' AND dst.serial_key = '002'
;
这是 a_horse_with_no_name 在 sqlfiddle.com 上发布的内容:
WITH id_values (new_key, old_key, id) as (
values ('0002', '002', '01')
), src AS (
UPDATE serial_rate
SET rate = 22.53,
serial_key = (select new_key from id_values)
WHERE serial_key = (select old_key from id_values)
AND id = (select id from id_values)
RETURNING *
)
UPDATE serial_table dst
SET serial_key = src.serial_key
FROM src
WHERE dst.id = (select id from id_values)
AND dst.serial_key = (select old_key from id_values)
;
这实际上是 wildplasser 发布的内容的修改版本,作为对我关于 serial_key
字段是否可以使用一次的查询的回复。