2017-10-16 60 views
0

我正在綁定幾個表到一個腳本。要做到這一點,我意識到我需要使用INNER JOIN,這讓我感到困惑。SQLite腳本從多個表中選擇

"SELECT UserSpecies.commonName, UserSpecies.commonNameFR, UserSpecies.commonNameES, UserSpecies.commonNameDE, UserSpecies.speciesName, UserSpecies.speciesRegion, UserSpecies.speciesDetails, UserSpecies.maxSize, UserSpecies.creditSource, UserSpecies.UserCreated, UserSpecies.genusUC, UserSpecies.familyUC, UserSpecies.orderUC, UserSpecies.groupUC, UserSpecies.subGroupUC, UserSpecies.authority, Genus.name, Family.name, Orders.name, Groups.name, SubGroups.name, Types.name, IUCN.name 
FROM UserSpecies 
INNER JOIN Genus ON UserSpecies.genusKey = Genus.id 
INNER JOIN Family ON UserSpecies.familyKey = Family.id 
INNER JOIN Orders ON UserSpecies.orderKey = Orders.id 
INNER JOIN Groups ON UserSpecies.groupKey = Groups.id 
INNER JOIN SubGroups ON UserSpecies.subGroupKey = SubGroups.id 
INNER JOIN Types ON UserSpecies.typeKey = Types.id 
INNER JOIN IUCN ON UserSpecies.iucnKey = IUCN.id 
WHERE UserSpecies.id = %d" 

當我運行上述,我沒有得到任何錯誤,但它根本不檢索數據。

注意:所有表和列都是正確的。

我缺少什麼?

+0

你是否使用python?嘗試在具有特定ID的sqlite控制檯中執行此操作。 –

+0

請提供一些示例數據和您所需的輸出。 (參見[堆棧溢出 後如何 格式SQL表?](https://meta.stackexchange.com/q/96125)如何增加一些。) –

回答

1

這很可能是您的數據庫中缺少信息。

只有與已連接的表有一個(或多個)匹配時,「內部連接」語句纔會檢索數據。

你的情況,這意味着如果一些數據在連接表的一人失蹤(家庭,等..),你不會得到任何結果。 例如,如果沒有家庭使用id = UserSpecies.familyKey(在家庭表),你將得到的數據。

您可以嘗試使用「左連接」而不是「內連接」:即使沒有匹配,它也會返回結果。在這種情況下,相應的值將是無效的:如果沒有家庭匹配你會得到Family.name值「空」。通過這種改進的要求,你會很容易地發現丟失的數據(如果有的話):

"SELECT UserSpecies.commonName, UserSpecies.commonNameFR, UserSpecies.commonNameES, UserSpecies.commonNameDE, UserSpecies.speciesName, UserSpecies.speciesRegion, UserSpecies.speciesDetails, UserSpecies.maxSize, UserSpecies.creditSource, UserSpecies.UserCreated, UserSpecies.genusUC, UserSpecies.familyUC, UserSpecies.orderUC, UserSpecies.groupUC, UserSpecies.subGroupUC, UserSpecies.authority, Genus.name, Family.name, Orders.name, Groups.name, SubGroups.name, Types.name, IUCN.name 
FROM UserSpecies 
LEFT JOIN Genus ON UserSpecies.genusKey = Genus.id 
LEFT JOIN Family ON UserSpecies.familyKey = Family.id 
LEFT JOIN Orders ON UserSpecies.orderKey = Orders.id 
LEFT JOIN Groups ON UserSpecies.groupKey = Groups.id 
LEFT JOIN SubGroups ON UserSpecies.subGroupKey = SubGroups.id 
LEFT JOIN Types ON UserSpecies.typeKey = Types.id 
LEFT JOIN IUCN ON UserSpecies.iucnKey = IUCN.id 
WHERE UserSpecies.id = %d" 

如果你想對「加盟」關鍵詞的不同口味,瞭解詳情可以看看這裏: What is the difference between "INNER JOIN" and "OUTER JOIN"?

小心:sqlite只支持連接操作的一個子集。

+0

謝謝你,我沒有你有什麼建議和發現錯誤。 –