3

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

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

简而言之,当同名的两列的数据类型不同时,自然连接如何发生?

4

4 回答 4

8

NATURAL JOIN被普遍接受为一种反模式。

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

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

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

根据经验和个人喜好,显式比隐式更易于维护。并且没有性能问题。

于 2012-10-16T12:25:22.860 回答
1

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

于 2012-10-16T12:28:26.440 回答
1

如果您使用不同的数据类型,则在执行匹配之前强制进行数据类型转换。那是额外的工作。另一方面,如果没有对列执行任何数学运算并且该值未用作数字,则应将其存储为字符。

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

于 2012-10-16T22:59:46.800 回答
0

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

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

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

自然连接不是一个好习惯,因为

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

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

3.如果其他列被添加到同名的表中

于 2018-08-29T19:54:43.807 回答