避免在SQL插入中重复预定义值

问题描述

我希望插入与一对ID相关联的两个值,而不在查询中对这些ID进行硬编码。
更具体地说,我有此表foo

create table if not exists foo(id int,val text);

我可以通过以下方式插入我的值:

insert into foo
values
  (10,'qwe_1'),(10,'qwe_2'),'qwe_3'),(20,'asd_3'),'asd_4');

但是我不想重复那些1020

不久前,我问了类似的问题(SQL - Using WITH to declare variable on INSERT INTO),但它不能解决我的问题。 我也无法理解如何使用INSERT repeating values in SQL中建议的联接或类似方法,因为我想为每个id添加的值列表是任意的。


虽然不是严格需要,但我想使用with语句首先声明我的ID:

with c (first_id,second_id) as (values (10,20))
select * from c;

但我不知道如何将其与insert into语句结合使用。我有这个无法正常工作的查询,但它说明了我要实现的目标:

with c (first_id,20))
insert into foo
values
  (c.first_id,(c.first_id,(c.second_id,'asd_4')
from c;

我的理解是values (...),...语句返回一个表,所以也许我缺少的是将该表与c表组合的一种方式。

解决方法

您可以使用横向连接:

insert into foo (id,val)
    select v.id,v.val
    from (values (10,20)) c(first_id,second_id) cross join lateral
         (values (c.first_id,'qwe_1'),(c.first_id,'qwe_2'),'qwe_3'),(c.second_id,'asd_3'),'asd_4')
         ) v(id,val);
,

如果您能够使用块结构,则可以使用该路由。

do $$
DEFINE
    v_first_id  NUMBER := 10;
    v_second_id NUMBER := 20;
BEGIN
    ... Your Insert Statement ...
END; $$

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...