2013-03-07 57 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