当我们使用 NATURAL JOIN 连接两个表时,连接操作是在 Common Column Names 的基础上执行的。当我们在两个表中有两个同名的列时,只显示公共记录。
我有一个查询,当我们有同名但数据类型不同的列时,这些列也会被连接。我的意思是假设 table1 中的 column_1 具有数据类型 INTEGER,而 table2 中的 column_1 具有数据类型 VARCHAR,连接是基于这两列执行的。
简而言之,当同名的两列的数据类型不同时,自然连接如何发生?
NATURAL JOIN
被普遍接受为一种反模式。
它会导致许多可维护性问题。这只是其中之一。
而是使用显式连接,您可以在其中键入强制转换字段。
table1
INNER JOIN
table2
ON table2.fieldX = CAST(table1.fieldX AS INT)
根据经验和个人喜好,显式比隐式更易于维护。并且没有性能问题。
数据类型不必匹配,只要它们可以相互转换。但是,如果数据类型不一致,优化器可能无法使用索引。
如果您使用不同的数据类型,则在执行匹配之前强制进行数据类型转换。那是额外的工作。另一方面,如果没有对列执行任何数学运算并且该值未用作数字,则应将其存储为字符。
为属性选择数据类型后,您应该在定义该列的所有表中为该属性使用相同的数据类型。否则,您最终可能会进行隐式转换。
在脚本或查询中使用自然连接时请始终牢记。
指定 NATURAL JOIN 时,连接基于具有相同名称和“相同日期类型或不同数据类型:如果隐式转换是可能的”的所有列。指定 JOIN USING 时,仅连接指定的列。
自然连接不是一个好习惯,因为
1.如果在不同数据类型但相同名称的情况下隐式转换失败,它将忽略该列。
2.如果列名将来被重命名。
3.如果其他列被添加到同名的表中