2010-08-10 116 views
1

我有几个表:基本SQL联接查询

EVENT_TYPE(et),事件(e),event_booking(eb),人(p),person_address(p)和ADDRESS_COUNTRY(ac

他们加入了像这样:

et < - e < - eb - >p - >pa - >ac

每个连接都有一对一的关系,除了eb - >p链接。 eb中的一行可以具有null而不是来自p的ID。

我想获得所有预订,不管p中是否有对应的行。

所以,一个简单的左连接。

但哪个更好? (或者是有没有更好的办法?)

et J e J eb LJ p LJ pa LJ ac(我假定这将被同等对待,以ac J pa J p RJ eb RJ e RJ et?)

et J e J eb LJ (p J pa J ac)(即左加入一个子选择)

回答

1

我通常使用下面的语法 - 这在某种程度上相当于你的第二个场景

select 
    * 
from 
    eb 
    inner join e on eb.eId = e.eId 
    inner join et on e.etId = et.etId 
    left join p 
      inner join pa on p.paId = pa.paId 
      inner join ac on pa.acId = ac.acId 
     on eb.pId = p.pId 

我不知道对性能的影响,但如果这两种情况下产生相同的查询计划,我也不会感到惊讶

+0

谢谢Kristof,我认为那会很理想。奇怪的语法我以前没有真正使用! – aidan 2010-08-12 10:11:04

1

只需使用EXPLAIN测试您的查询,就会显示是否以及如何使用密钥。