2013-03-07 99 views
1

我有一個名爲'ELEMENTS'的表。在這個查詢中,應該有與ELEMENTS中的行一樣多的結果。多表SQL查詢返回意外結果

ELEMENT表具有與其他表中的文本值對應的數值。我畫出了這張有關係的照片。這些線條表示相應的鍵,圓圈是我需要的文本值。

enter image description here

這裏是我的查詢:

SELECT ELEMENTS.RID, 
     TAXONOMIES.SHORT_DESCRIPTION, 
     type, 
     ELEMENT_NAME, 
     ELEMENT_ID, 
     SUBSTITUTION_GROUPS.DESCRIPTION, 
     namespace_prefix, 
     datatype_localname 
FROM ELEMENTS,SUBSTITUTION_GROUPS,TAXONOMIES,SCHEMAS,DATA_TYPES 
WHERE 
    ELEMENTS.TAXONOMY_ID = TAXONOMIES.RID AND 
    ELEMENTS.SUBSTITUTION_GROUP_ID = SUBSTITUTION_GROUPS.RID AND 
    ELEMENTS.ELEMENT_SCHEMA_ID = SCHEMAS.RID AND 
    ELEMENTS.DATA_TYPE_ID = DATA_TYPES.RID 

這給了我20個左右的記錄時,我應該有幾千。我查看了記錄,但無法找出它顯示的記錄中的模式。

+0

+1結構良好且具體的問題 – 2013-03-07 02:45:05

回答

3

可能您的維度爲NULL或未完整填充。您可以通過使用left outer join解決這個問題:

SELECT ELEMENTS.RID, TAXONOMIES.SHORT_DESCRIPTION, type, ELEMENT_NAME, ELEMENT_ID, 
     SUBSTITUTION_GROUPS.DESCRIPTION, namespace_prefix, datatype_localname 
FROM ELEMENTS left outer join 
    SUBSTITUTION_GROUPS 
    on ELEMENTS.SUBSTITUTION_GROUP_ID = SUBSTITUTION_GROUPS.RID left outer join 
    TAXONOMIES 
    on ELEMENTS.TAXONOMY_ID = TAXONOMIES.RID left outer join 
    SCHEMAS 
    on ELEMENTS.ELEMENT_SCHEMA_ID = SCHEMAS.RID left outer join 
    DATA_TYPES 
    on ELEMENTS.DATA_TYPE_ID = DATA_TYPES.RID 

如果你正在學習SQL,你應該學會:

  1. 正確的ANSI標準JOIN語法
  2. ,前綴中每個字段的查詢與該表的地方來自
  3. 使用簡短但易於理解的別名,例如「e」表示元素,「t」表示分類。
+0

+1爲了放大一點,OP使用的語法導致隱式INNER連接,其中主錶行將被排除,除非在所有其他連接中存在匹配的行表。外連接將產生所需數量的行,但從連接表中檢索的一些數據將爲空。是的,連接應該總是使用明確的JOIN ... ON語法來編寫,而不是使用舊的(1980年代)語法。 – 2013-03-07 02:47:51

+0

謝謝Gordon的修復,並感謝Jim的解釋! – 2013-03-07 03:11:27