【问题标题】:oracle union caluse: what happens if there is a column name mismatchoracle union caluse:如果列名不匹配会发生什么
【发布时间】:2011-07-07 09:56:11
【问题描述】:

在 oracle 中,当我这样做时: select table1.col1 from table1 union select table2.col2 from table2

它给了我所有记录的联合,结果列的名称是 col1。

这不应该因为列名不匹配而引发错误吗?

【问题讨论】:

  • 否...结果集是从第一个选择创建的,只要“类型”匹配,就会附加第二个选择的结果集。

标签: sql oracle


【解决方案1】:

只要列数据类型不匹配,列名将始终来自第一个查询。它不应该(并且,正如您所发现的那样)不会抛出错误。

如果数据类型不匹配,即使可以进行隐式转换,一般也会报错

SQL> /
select 1 a from dual union select '2' from dual
       *
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression

SQL> /
select '1' a from dual union select 2 from dual
       *
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression

【讨论】:

  • 我不了解 Oracle,但 MySQL 和 Postgresql 不会抱怨类型不匹配,只要有可能进行非破坏性转换。不过,这可能是一个配置选项。
  • @Krtek - Oracle 通常不进行数据类型转换。在我的答案中发布测试用例。
  • 为什么不应该出现错误?这就像说 2 个苹果 + 3 个橙子 = 5 个苹果。我错过了什么?
  • 从集合论的角度来看,列的名称是无关紧要的。对人类来说,理解数据只是有用的东西。数据库不会尝试确定您的查询是否有意义——因为您的 UNION 正在尝试创建 FRUIT 视图,所以一行有两个苹果和一行有 3 个橙子可能是完全合理的。汇总数字数据以确定您有 5 个水果可能有意义,也可能没有意义。并且选择为结果使用糟糕的别名可能会令人困惑,但这不是错误。
  • 在 Oracle 中,是否有强制列名匹配的方法?追踪了一个令人讨厌的错误,其中第二个查询中的一列以错误的顺序放置,但查询运行良好......
【解决方案2】:

union 不关心列名,它只关心列的数量以及最终的类型。

通常,列的名称来自union 中的第一个查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2013-04-21
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    相关资源
    最近更新 更多