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表查询出来的一条记录。
这个如何一条语句实现?谢谢!
格式是这样的 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查询的主要内容,如果未能解决你的问题,请参考以下文章
SQLite INSERT SELECT 查询结果到现有表中?