【问题标题】:Natural Join Scenario自然加入场景
【发布时间】:2018-08-30 04:13:09
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        一旦你为一个属性选择了一个数据类型,那么你应该使用它 在该列所在的所有表中,该属性的数据类型相同 定义。否则你可能会得到一个隐式转换。

        【讨论】:

          【解决方案4】:

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

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

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

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

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-04-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-06-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多