我有以下要求:
select * from tbA A, tbB B, tbC C, tbD D where A.ID=B.ID and B.ID2= C.ID2 and A.ID=D.ID and C.ID3=D.ID3 and B.ID4=D.ID4 and A.Foo='Foo'
我多次听说过这种连接语法是折旧的,我应该使用'JOIN'关键字.
如何在这种复杂的连接中执行此操作(多个表连接在属于不同表的多个列上)?您认为这种最佳做法仍适用于此吗?
这是一个品味问题,但我更喜欢JOIN关键字.它使逻辑更清晰,并且与随之而来的LEFT OUTER JOIN语法更加一致.请注意,您也可以使用与JOIN同义的INNER JOIN.
语法是
a JOIN b ON expression relating b to all of the tables before
b可以是连接本身.对于内部联接并不重要,但对于外部,您可以控制联接的顺序,如下所示:
select * from a left join d join c on d.i = c.i on a.k = d.k
这里a左连接到d和c之间的内连接.
这是您的查询:
select * from tbA A join tbB B on A.ID = B.ID join tbC C on B.ID2 = C.ID2 join tbD D on A.ID = D.ID and C.ID3 = D.ID3 and B.ID4 = D.ID4 where A.Foo='Foo'
我发现连接语法更容易理解
select * from tbA A inner join tbB B on a.id = b.id inner join tbC C on b.id2 = c.id2 inner join tbD D on a.id = d.id and c.id3 = d.id3 and b.id4 = d.id4 where A.Foo='Foo'
现在,您可以清楚地看到数据如何连接在一起,并且它不是一个非常复杂的连接.
顺便说一下,你的例子中的数据库设计强烈缺乏正常化的气味.通常你应该有一个表连接到许多(a.bid上的连接b = b.bid连接c在a.cid = c.cid上)或链(a.bid上的连接b = b.bid连接c在b.cid = c.cid).
编辑.添加了可选关键字INNER,它不会改变结果,但会更清晰.