将三个表中的行组合成一组pid(一个引用ID)

时间:2015-12-12 06:13:15

标签: mysql sql

我在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')

1 个答案:

答案 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;