搜索

SQL语句如何等于多个子查询的值,如图所示,谢谢各位大神,写存储过程...

发布网友 发布时间:2022-04-24 06:36

我来回答

3个回答

热心网友 时间:2022-04-13 12:56

不用存储过程,一个sql语句搞定

创建表及数据

create table a
(id int,
a varchar2(3),
b varchar2(100));
create table b
(id int,
c varchar2(3),
d varchar2(100));
create table c
(id int,
e varchar2(3),
f varchar2(100));

insert into a values (1,'001',null);
insert into a values (2,'002',null);
insert into a values (3,'003',null);
insert into a values (4,'004',null);
insert into a values (5,'005',null);
insert into a values (6,'006',null);
insert into b values (1,'001','chao');
insert into b values (2,'001','qian');
insert into b values (3,'002','sun');
insert into b values (4,'003','li');
insert into b values (5,'003','zhou');
insert into c values (1,'001','wu');
insert into c values (2,'002','zhen');
insert into c values (3,'003','wang');
commit;

 

执行

update a t1 set t1.b=
(select t2.col2
from
(select col1,replace(wm_concat(col2),',','/') col2
from
(select 1 id,c col1,d col2 from b
union all 
select 2 id,e col1,f col2 from c) t
group by col1) t2
where t1.a=t2.col1);

 

结果

 

这个wm_concat你要是用不了,就改成sys.wm_concat,再不行,你就把你当前用户赋一个dba权限

热心网友 时间:2022-04-13 14:14

oracle的话,用wm_concat,像badkano写的那样就可以了。


sql server的话,用cross apply + for xml,像这样:

--创建测试表
create table ttA(id int identity(1,1),a varchar(10),b varchar(200))
insert into ttA
select '001',null union all
select '002',null union all
select '003',null union all
select '004',null union all
select '005',null union all
select '006',null
create table ttB(id int identity(1,1),c varchar(10),d varchar(20))
insert into ttB
select '001','chao' union all
select '001','qian' union all
select '002','sun' union all
select '003','li' union all
select '003','zhou' 
create table ttC(id int identity(1,1),e varchar(10),f varchar(20))
insert into ttC
select '001','wu' union all
select '002','zhen' union all
select '003','wang' 
--用cross apply和for xml path实现字段聚合
update ttA set b=stuff(t2.value,1,len('/'),'') from ttA
cross apply(
select '/'+value from (
  select c [key],d value from ttB 
union 
select e [key],f value from ttC
) t1 
where t1.[key]=ttA.a for xml path('')) t2(value)
--查看结果
select * from ttA

--删除测试表
drop table ttA
drop table ttB
drop table ttC

热心网友 时间:2022-04-13 15:49

没有明白你的意思 是要查询数据 还是 更改数据
查询就简单追问我要把对面的数据给跟新过来

追答用一条SQL实现起来有点难
还好你是用存储过程
给你说思路吧
循环A表 设置 A 表B字段的值为 空字符串
再利用 A字段到 B 和 C里面找对应关系的 找到一条就用 A表B字段的值加上"/" 再加上找到的 B表d字段和C表F字段的字

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com

热门图文

Top