【问题标题】:Why is ORACLE throwing ORA-01790?为什么 ORACLE 会抛出 ORA-01790?
【发布时间】:2019-06-25 12:23:52
【问题描述】:

我有一个关于 UNION ALL 语句的查询。

SELECT * FROM HULL_A
    UNION ALL
SELECT * FROM HULL_B;  

它会抛出错误

ORA-01790 "表达式必须与对应的数据类型相同 表达”

但是,我检查了一下,我认为情况并非如此。我使用以下检查:

select db1.data_type, db2.data_type, db1.data_length, db2.data_length, db1.data_precision, db2.data_precision, db1.data_scale, db2.data_scale
from all_tab_columns db1
     inner join all_tab_columns db2
       on (db1.owner = db2.owner
           and db1.column_name = db2.column_name)       
where db1.table_name = 'HULL_A'
  and db2.table_name = 'HULL_B'
  and (
        db1.data_type = db2.data_type
        OR 
        db1.data_length = db2.data_length
      ) 

结果是:

我能够使用 UNION ALL 将 HULL_A 链接到 HULL_C 和 HULL_D。

那么为什么 ORACLE 会抛出错误?为了能够执行 UNION ALL,我还可以执行哪些其他测试?

我正在开发 WINDOWS 10 ORACLE 11g

【问题讨论】:

  • Oracle 不允许混合数据类型是有充分理由的,因为 ANSI/ISO SQL 标准严格禁止混合数据类型。见demo
  • “但是,我检查过,我认为情况并非如此。” 计算机/软件不会撒谎或给出无效的错误信息..
  • 另请参阅Why should I provide a Minimal Reproducible Example for a very simple SQL query? 以提供更好的示例数据和预期结果
  • JOIN 不是由 COLUMN_NAME 完成的,而是由基于 COLUMN_ID 的位置完成的,也许有人添加或删除了列?最好使用限定名称而不是 *...
  • 为什么会报错?因为列之间的数据类型不匹配。也许两个表中列的顺序不同(列是按 UNION 中的位置而不是名称匹配的),或者这两个表对于“相同”列的类型确实不同。请edit您的问题(点击下方的edit 链接)并将两个表格的create table 语句添加为formatted text

标签: sql oracle


【解决方案1】:

两个表中的列必须具有相同的数据类型并且列的顺序必须相同。

您可以尝试以下查询来识别两个表的列中的不匹配:

SELECT
    A.COLUMN_ID COLUMN_HULL_A,
    A.DATA_TYPE DATA_TYPE_HULL_A,
    B.COLUMN_ID COLUMN_HULL_B,
    B.DATA_TYPE DATA_TYPE_HULL_B
FROM
    (
        SELECT
            COLUMN_ID,
            DATA_TYPE
        FROM
            USER_TAB_COLUMNS
        WHERE
            TABLE_NAME = 'HULL_A'
    ) A
FULL OUTER JOIN (
    SELECT
        COLUMN_ID,
        DATA_TYPE
    FROM
        USER_TAB_COLUMNS
    WHERE
        TABLE_NAME = 'HULL_B'
)B ON (A.COLUMN_ID = B.COLUMN_ID AND A.DATA_TYPE = B.DATA_TYPE)
WHERE
    A.COLUMN_ID IS NULL
    OR B.COLUMN_ID IS NULL;

干杯!!

【讨论】:

  • 两个表中的列名不必相同。在联合操作中只考虑数据类型。如果两个表中的列名在同一列 ID 处不同,则查询永远不会失败。
猜你喜欢
  • 2021-07-27
  • 2010-12-24
  • 2011-02-04
  • 1970-01-01
  • 2021-07-24
  • 2019-04-12
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多