我在mysql下面有表格,
tbl_1:
tbl_2:
tbl_3:
从上面的三个表中,我试图将每组pid的行组合成一个单独的表,如下所示:
因此,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')
答案 0 :(得分:0)
我建议您使用以下查询来获取结果集,如屏幕截图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;