我有两张桌子的数据。该列如下所示:
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行。
两个表都有冗余行。
任何帮助都将不胜感激。
答案 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;
这个查询给了我想要的结果。