insert 插入带select查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了insert 插入带select查询相关的知识,希望对你有一定的参考价值。

我想实现以下功能:
表M 有三项ABCD,表N有一项CDFE
然后有个函数传入三个参数ABC 将ABC插入表M,
准备要把N里面查询出来的一条记录C插入M里,
有没有简单的 一句SQL语句搞定??
insert into m (ABCD)values (A,B,select c from N) 这写总是不行!
请指点,谢谢!
不好意思 写错了!请看: M 表有4个字段为ABCD, N表有4个字段CDEF,

现在准备向M表中插入三个参数ABC值,不过C是从N表查询出来的一条记录。

这个如何一条语句实现?谢谢!

参考技术A insert into M (a,b,c,d) values ('a','b',(select c from N where 你的条件),'d')
格式是这样的 where条件中要保证只查出一个值 values中字符串要加英文单引号

能说清楚点吗?M表有三项ABCD我就不明白了 ABCD是4项啊…汗…你说的项是列?说的明白点我或许能帮你…
参考技术B 大概这样的格式写,你根据你的需求调整列名的数量吧:

insert into M(A,B,C)
select 'A','B',C from N本回答被提问者采纳
参考技术C 得用存储过程了

PostgreSQL INSERT INTO SELECT CASE 问题

【中文标题】PostgreSQL INSERT INTO SELECT CASE 问题【英文标题】:PotgresSQL INSERT INTO SELECT CASE problem 【发布时间】:2020-04-25 11:06:44 【问题描述】:

我有以下查询,我想从子查询中插入任意数量的行。当然我得到一个错误SQL Error [21000]: ERROR: more than one row returned by a sub query used as an expression,因为一些子查询返回多行

insert into logs (_timestap, _message, _mode, _user_id)
select :_timestamp, :_message, :_mode,
case :_mode

    -- select all users that have the given grade. NOTE that this sub query returns multiple rows
    when 'byGrade' then (select u.id from users u where grade = :_grade)

    -- The user id value is already passed
    when 'byIndividual' then (select :_user_id limit 1)

    -- This sub query also returns multiple rows (all infact) from the users table
    when 'everyone' then (select id from users)
end

PostgreSQL 版本 10。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

union all可以帮忙:

insert into logs (_timestap, _message, _mode, _user_id)

select :_timestamp, :_message, :_mode, id
from users
where :_mode = 'byGrade' and grade = :_grade

union all

select :_timestamp, :_message, :_mode, :_user_id
where :_mode = 'byIndividual'

union all

select :_timestamp, :_message, :_mode, id
from users
where :_mode = 'everyone';

【讨论】:

【参考方案2】:

这需要过程代码,可以在数据库客户端使用您最喜欢的编程语言 (TM) 或 database server-side procedural language。普通 SQL 是声明性语言,没有高级 conditionals。 SQL CASE 不足以完成这项工作。

在 Pl/PgSQL 中它看起来像:

CREATE FUNCTION do_the_thing(
  p_timestap timestamptz,
  p_message text,
  p_mode text,
  p_user_id integer)
RETURNS VOID
LANGUAGE plpgsql AS $definition$
BEGIN
if p_mode = 'byGrade' then
  insert into logs (_timestap, _message, _mode, _user_id)
  select p_timestamp, p_message, p_mode, u.id from users u where grade = p_grade;
elsif p_mode = 'byIndividual' then
  insert into logs (_timestap, _message, _mode, _user_id)
  select p_timestamp, p_message, p_mode, p_user_id;
elsif p_mode = 'everyone' then
  insert into logs (_timestap, _message, _mode, _user_id)
  select p_timestamp, p_message, p_mode, id from users;
end if;
END; 
$definition$;

【讨论】:

以上是关于insert 插入带select查询的主要内容,如果未能解决你的问题,请参考以下文章

使用INSERT…SELECT语法插入记录

Hive insert 字段表错位踩坑

SQLite INSERT SELECT 查询结果到现有表中?

mysql insert 多少条会慢

Mybatis使用中,同一个事物里,select查询不出之前insert的数据

数据库之查询语句