2012-07-24 73 views
2

我有大约10个表。一个具有主键和所有其他表的表通过外键连接到该单个表。 例如。基于主键加入多个sql表

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,但它是给予还原剂数据。对于每个显示外键的表格,请提前致谢。

$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斧,通过,BZ,镉,CF FROM A,B,C,其中AX是为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 
+2

请提供您使用,直至现在的查询。 – 2012-07-24 13:58:57

+0

也许创建这些表? – devanand 2012-07-24 13:59:52

+0

@KubaWyrostek:我编辑并提供了两种方式,我尝试过。第一种是给予多余的外键,第二种是给予交集,因为可能不会有所有表 – user1512411 2012-07-24 15:02:06

回答

0

左加入应该在这里工作

下面是一个例子(我使用SQL服务器,但逻辑应该是完全一样的)

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 
0

让表A已经cloumn xy和B具有xz

然后查询select * from A, B where A.x = B.x会给冗余数据。如你所说。 另外,您可以编写查询作为select A.x, A.y, B.y from A, B where A.x = B.x

+0

我已经试过了。第一个是给予冗余数据,第二个只给出一行,因为有很多表,其中一些没有与主键关联的外键,因为我正在使用AND,它只是给所有的交叉点 – user1512411 2012-07-24 14:57:46

+0

IT是可以的两个表,但我有10左右,当我使用和Ax = Bx和Ax = Cx然后它给交集。而我想要所有的A.x值 – user1512411 2012-07-25 08:16:15

+0

然后选择A. *会做 – 2012-07-25 08:18:56