我有大约10张桌子。一个具有主键和所有其他表的表通过外键连接到该单个表。 例如
Table main : 1,2,3,4,5,6,7,8
Tablechild: 1,2,3
Tableanchild: 1,3,5
Tableachild: 1,2,4,5
我想提取主表和所有其他表的完整数据,例如。
1 "tablechild data" "tableanchild data" tableachild data"
2 tablechild data tableachild data
3 tablechild data tableanchild data
4
5
6
7
8
我使用了left join
,但它提供了reduntant数据。对于每个显示外键的表都要提前谢谢。
$sql = "SELECT * FROM login AS jon
LEFT JOIN re as rec ON jon.no=rec.no
LEFT JOIN bio as bio ON jon.no=bio.no
LEFT JOIN pon as po ON jon.no=po.no
LEFT JOIN rec as re ON jon.no=re.no
LEFT JOIN spn as sp ON jon.no=sp.no" ;
我也试过
" SELECT login.no,re.name ,re.num,bio.address,bio.phone,pon.lline,pon.set,rec.book,rec.pen,spn.rub,spn.stylo FROM login,re,bio,pon,rec,spn WHERE login.no=re.no AND login.no=bio.no AND login.no=pon.no AND login.no=rec.no AND login.no=spn.no ";
我想这样做 SELECT A.x,B.y,B.z,C.d,C.f FROM A,B,C WHERE A.X是不同的 因为x是A中的主键,而其他键中是外键。 预期产出
1 B data
2 B data C data
3 C data
4 B data C data
5
现在我正在
1 B data
1 ....
1 .......
2 ....
2 ......
3
4
4
5
答案 0 :(得分:0)
让表格A
包含x
列和y
,而B有x
和z
然后查询select * from A, B where A.x = B.x
将提供冗余数据。如你所说。
或者,您可以将查询编写为select A.x, A.y, B.y from A, B where A.x = B.x
答案 1 :(得分:0)
左连接应该在这里工作
这是一个例子(我使用的是sql server,但逻辑应完全相同)
declare @main table (pk int)
insert into @main(pk) values (1),(2),(3),(4),(5),(6),(7),(8)
declare @childA table(afk int)
declare @childB table(bfk int)
declare @childC table(cfk int)
insert into @childA(afk) values (1),(2),(3)
insert into @childB(bfk) values (1),(3),(5)
insert into @childC(cfk) values (1),(2),(4),(5)
select * from
@main m
left join @childA a on m.pk = a.afk
left join @childB b on m.pk = b.bfk
left join @childC c on m.pk = c.cfk
只需确保主是起始表,并且不应存在冗余数据。
因此,在您的情况下,您的查询将类似于:
select * from
mainTable m
left join childA a on m.pk = a.afk
left join childB b on m.pk = b.bfk
left join childC c on m.pk = c.cfk