自然加入场景

时间:2012-10-16 12:21:56

标签: sql oracle

当我们使用NATURAL JOIN连接两个表时,基于Common Column Names执行连接操作。 当我们在两个表中有两个具有相同名称的列时,只显示公共记录。

我有一个查询,当我们有相同名称但不同数据类型的列时,这些列也会加入。 我的意思是假设table1中的column_1具有数据类型INTEGER而table2中的column_1具有数据类型VARCHAR,则基于这两列执行连接。

简而言之,当两个具有相同名称的列的数据类型存在差异时,自然连接是如何发生的?

4 个答案:

答案 0 :(得分:8)

NATURAL JOIN通常被认为是一种反模式。

它会导致许多可维护性问题。这只是其中之一。

而是使用显式连接,您可以在其中键入强制转换字段。

  table1
INNER JOIN
  table2
    ON table2.fieldX = CAST(table1.fieldX AS INT)

根据经验和个人偏好,明确比隐含更容易维护。而且没有性能问题。

答案 1 :(得分:1)

只要数据类型可以相互转换,就不必匹配。但是,如果数据类型不一致,则优化程序可能无法使用索引。

答案 2 :(得分:1)

如果使用差异数据类型,则强制数据 可以执行匹配之前的类型转换。这是额外的工作。 另一方面,如果没有对列进行数学运算 如果不将值用作数字,则应将其存储为字符。

为属性选择数据类型后,您应该使用它 列所在的所有表中该属性的相同数据类型 定义。否则,您最终可能会进行隐式转换。

答案 3 :(得分:0)

在脚本或查询中使用自然联接时,请始终牢记。

  • 关联的表具有一对或多对同名的列。
  • 如果可以对该列的所有行进行隐式转换,则这些列可以具有不同的数据类型,否则该列将被排除。
  • 请勿在自然联接中使用ON子句。

当指定NATURAL JOIN时,联接基于具有相同名称和“相同日期类型或不同数据类型:如果可能进行隐式转换”的所有列。 指定JOIN USING时,仅将指定的列连接起来。

使用自然联接不是一个好习惯,因为

1。如果在数据类型不同但名称相同的情况下隐式转换失败,它将忽略该列。

2。如果列名将来被重命名。

3.if其他列添加到具有相同名称的表中

相关问题