2010-08-10 79 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測試您的查詢,就會顯示是否以及如何使用密鑰。