gpt4 book ai didi

mysql - 将三个表中的行合并为每组 pid 的一个表(一个引用 id)

转载 作者:行者123 更新时间:2023-11-29 21:44:11 26 4
gpt4 key购买 nike

我在 mysql 中有下面的表,

tbl_1:

enter image description here

 tbl_2:

enter image description here

 tbl_3:

enter image description here

从上面三个表中,我尝试将每组 pid 的行合并到一个表中,如下所示:

enter image description here

因此,tbl_3 的最大行数为 (4),tbl_2 的最大行数为 3 行,tbl_1 的每个 pid 为一行。

只有 tbl_1 行可以是冗余的,但 tbl_2 和 tbl_3 不行。

我无法使用联接,因为我没有任何其他键可供引用,我应该在所有这三个表中仅使用 pid 并将它们转储到单个表中。如果我使用的话,我也会得到tbl_2和tbl_3的冗余数据。

为此,我使用了一个复杂的 SP,它为每组 pid 创建一个临时表,并为 tbl_2 和 tbl_3 更新它。但有人告诉我,逐行更新而不是基于集合更新不是正确的做法。

如何使用 mysql 查询获得所需的结果?

编辑:到目前为止我尝试了以下方法

create table tbl_1(pid int, loc varchar(100), avaId int,xpId int,qf varchar(100));
create table tbl_2(soid int,pid int,sid int,name2 varchar(100), nrt2 int);
create table tbl_3(woid int,pid int,wid int,name3 varchar(100), nrt3 int);

create table tbl_sourcef(id int primary key auto_increment,pid int, loc varchar(100), avaId int,xpId int,qf varchar(100),sid int,nrt2 int,wid int,nrt3 int);

将数据插入以上表格后

insert into tbl_1 values (1000,'Bangalore',30,9,'ABC');

insert into tbl_2 values(0,1000,1,'name1',8);
insert into tbl_2 values(1,1000,8,'name2',5);
insert into tbl_2 values(2,1000,7,'name3',6);

insert into tbl_3 values(0,1000,2,'D1',9);
insert into tbl_3 values(1,1000,1,'D2',2);
insert into tbl_3 values(2,1000,3,'D3',0);
insert into tbl_3 values(3,1000,4,'D4',5);

我使用名为 fupdate() 的存储过程

这是 SP 的定义:

CREATE PROCEDURE fupdate(
pid int,loc varchar(100),avaId int,xpId int,qf varchar(100)
)
begin
declare pi int Default 1;
WHILE pi <= 10 DO
insert into tbl_sourcef(pid,loc,avaId,xpId,qf)values(pid,loc,avaId,xpId,qf);
SET pi = pi + 1;
END WHILE;

begin
declare i int Default 1 ;
declare si int default 0;
declare es int;
set es=(select count(sid) from tbl_2 where pid=pid);
WHILE i <= es DO
update tbl_sourcef ff
set ff.sid=(select sid from tbl_2 where soid=si and pid=pid),
ff.nrt2=(select nrt2 from tbl_2 where soid=si and pid=pid)
where id=i and pid=pid;
SET i = i + 1;
SET si=si+1;
END WHILE;
end;
begin
declare wi int Default 1 ;
declare wii int default 0;
declare ew int;
set ew=(select count(wid) from tbl_3 where pid=pid);
WHILE wi <= ew DO
update tbl_sourcef ff
set ff.wid=(select wid from tbl_3 where woid=wii and pid=pid ),
ff.nrt3=(select nrt3 from tbl_3 where woid=wii and pid=pid)
where id=wi and pid=pid ;
SET wi = wi + 1;
SET wii=wii+1;
END WHILE;
end;

end

请注意,当我使用第二组 pid 时,此 SP 失败:(..不确定是否有一些简单的方法可以实现预期结果而不是使用此 SP。

这就是我调用我的 SP -

call fupdate(1000,'Bangalore',30,9,'ABC')

最佳答案

我建议您使用以下查询来获取屏幕截图 4 中所示的结果集,而无需使用存储过程:

WITH cte AS
(
SELECT COALESCE(tt.pid, ttt.pid) AS pid, tt.sid, tt.name2,
ttt.wid, ttt.name3,ttt.nrt3
FROM tbl_2 tt
FULL OUTER JOIN tbl_3 ttt
ON tt.pid = ttt.pid
AND tt.soid = ttt.woid
)
select *
from tbl_1 t
JOIN cte c
ON t.pid = c.pid;

关于mysql - 将三个表中的行合并为每组 pid 的一个表(一个引用 id),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34236940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com