2015-04-01 34 views
0

我正在編寫一個映射器來從我的數據庫中獲取信息。帶有連接和可選匹配的SQL查詢

這裏是數據庫:

  • SPEL(ID,NAAM)

  • spelbord(ID,spel_id,電平)

    FK spel_id - > ID中spel

  • veld(spelbord _id,POSX,POSY,veldNr,isTarget,Toegang)

    FK spelbord_id - >在spelbord

  • entiteit(spelbord_id,POSX,POSY,entiteitNr)

    FK spelbord_id ID - > spelbord_id在草原

    FK POSX - > POSX在草原

    FK POSY - > POSY在草原

所以我想我的查詢給我: posX,posY,veldNr,Toegang,isTarget(和entiteitnr,如果它存在的話)每個veld。

例如:

1, 2, 1, true, false, 1 

(有對這個草原的entiteit),或

1, 3, 1, true, false, null 

(有對這個草原沒有entiteit)。

這是我的查詢,但它似乎沒有工作

select v.posX, v.posY, v.veldNR, v.toegang, v.isTarget, i.EntiteitNr 
from spel as s 
join spelbord as sb ON sb.Spel_ID = s.ID 
join veld v ON sb.id = v.Spelbord_id 
join entiteit i ON v.PosX = i.veld_PosX AND v.PosY = i.veld_PosY 
order by posX,posY 

與此查詢我只得到輸出,其中確有與它連接的entiteit。

我需要更改哪些行以獲得沒有entiteit匹配的行?

+1

使用'left join'而不是'inner join' – 2015-04-01 14:31:50

回答

0

您的查詢已結束;您需要向Enteitit和其他表之間的連接添加一個字LEFT。它還看起來好像你並不需要使用的SpeI或Spelbord在所有的,你需要選擇數據:

SELECT v.posX, v.posY, v.veldNR, v.toegang, v.isTarget, i.EntiteitNr 
    FROM veld AS v 
    LEFT JOIN entiteit AS i ON v.PosX = i.veld_PosX AND v.PosY = i.veld_PosY 
ORDER BY posX, posY 

的存在/不存在的SpeI和Spelbord應該不會影響結果。如果它們確實有所作爲,那麼您肯定可以將它們添加回來,但除非Spel和Spelbord中的ID列不是主鍵,否則它不太可能成爲問題。 (你記錄了外鍵;這很好,也可以記錄候選鍵。)