自然加入场景

问题描述 投票:3回答:4

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

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

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

sql oracle
4个回答
8
投票

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

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

而是使用显式连接,您可以键入转换字段。

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

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


1
投票

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


1
投票

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

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


0
投票

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

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.