MySQL:使两个表数据与给定列和相同数据合并

时间:2017-12-15 15:17:06

标签: mysql join relational-database

我有两张桌子的数据。该列如下所示:

  

B_1,B_2,B_3,规则,名称

其他表格列是:

  

规则,名称,A_1,A_2,A_3

我想要的结果表是:

  

B_1,B_2,B_3,规则,名称,A_1,A_2,A_3

示例数据:

b_1,b_2,b_3,rule,name
ab,sd,ed,mine,abhi
gh,jk,ka,nice,sid

rule,name,a_1,a_2,a_3
mine,abhi,qw,er,rt
nice,sid,zx,zx,cv

我需要的结果数据是:

b_1,b_2,b_3,rule,name,a_1,a_2,a_3
ab,sd,ed,mine,abhi,qw,er,rt 
gh,jk,ka,nice,sid,zx,zx,cv

我试过这个问题:

Select b_1,b_2,b_3,b.rule,b.name,a_1,a_2,a_3 from T1 a INNER JOIN T2 b ON b.rule=a.rule and b.name=a.name;

Select b_1,b_2,b_3,b.rule,b.name,a_1,a_2,a_3 from T1 a LEFT JOIN T2 b ON b.rule=a.rule and b.name=a.name;

P.S:

表T1有31465行。

表T2有31465行。

因此,即使表T3也应包含31465行。

两个表都有冗余行。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

有两个条件

1)如果两个表具有N-M的关系(意味着table1的每个项目在table2中具有M个项目,并且table2中的每个项目在table1中具有N个项目)

2)如果两个表的关系为1-M(意味着table1的每个项目在table2中都有M个项目,而table2中的每个项目在table1中都有1个项目)

在案例1中,您必须使用两个表的组合列创建另一个表,在您的情况下,它是规则,名称,例如,我们称之为 jointable ,然后表格就像

table1(a1,a2,a3,规则,名称)==>主键(规则,名称)

jointable(规则,名称)==>主键(规则,名称)

table2(b1,b2,b3,规则,名称)==>主键(规则,名称)

并且select语句将是

select table1.a1 ,table1.a2 ,table1.a3,table1.name,table1.rule,table2.b1,table2.b2,table2.b3
from jointable 
join table1 on table1.rule = jointable.rule and table1.name = jointable.name
join table2 on table2.rule = jointable.rule and table2.name = jointable.name

在案例2中,一个表包含主键(如table1中的规则和名称),另一个表(如table2)包含引用父表主键的外键,在这种情况下将是规则,table1的名称(注意表1是父项,表2的子项不能包含父项没有的值

所以表格就像:

table1(a1,a2,a3,规则,名称)==>主键(规则,名称)

table2(b1,b2,b3,规则,名称)==>外键(规则,名称)引用table1(规则,名称)

并且select语句如下:

select table1.a1 ,table1.a2 ,table1.a3,table1.name,table1.rule,table2.b1,table2.b2,table2.b3
  from table1 join table2 on table1.name=table2.name and table1.rule=table2.rule

答案 1 :(得分:0)

对我有用的答案是我必须为两个表上的每一行添加唯一标识符。列规则和名称对于两个表都是通用的,但两者都有冗余条目,我想保留冗余数据,因此我使用新的id列更新了表。

T1:

  

ID,B_1,B_2,B_3,规则,名称

T2:

  

ID,规则,名称,A_1,A_2,A_3

id列为NOT NULL并自动递增。

现在我有了一个共同的唯一列,通过它我可以加入这两个表。

Select b.b_1, b.b_2, b.b_3, rule, name, a.a_1, a.a_2, a.a_3 from T1 b INNER JOIN T2 a ON b.id=a.id;

这个查询给了我想要的结果。