【问题标题】:Multi table SQL query returning unexpected results多表 SQL 查询返回意外结果
【发布时间】:2013-03-07 02:21:45
【问题描述】:

我有一张名为“ELEMENTS”的表格。在此查询中,结果应该与 ELEMENTS 中的行数一样多。

ELEMENT 表具有与其他表中的文本值相对应的数值。我画了这张有关系的图。线条表示对应的键,圆圈是我需要的文本值。

这是我的查询:

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 条左右的记录,而我应该有数千条记录。我查看了记录,但无法找出它正在显示的记录中的模式。

【问题讨论】:

  • +1 个结构良好且具体的问题

标签: sql sql-server database relational-database


【解决方案1】:

大概,您的维度要么为 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”代表分类。

【讨论】:

  • +1 放大一点,OP 使用的语法导致隐式 INNER 连接,其中主表行将被排除,除非在所有其他连接表中存在匹配行。外连接将产生所需的行数,但从连接表中检索到的一些数据将为空。是的,连接应该总是使用显式的 JOIN...ON 语法而不是旧的(1980 年代)语法来编写。
  • 感谢 Gordon 的修复,感谢 Jim 的解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多