为什么ORACLE会抛出ORA-01790?

时间:2019-06-25 12:23:52

标签: sql oracle

我有一个带有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
      ) 

结果是: enter image description here

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

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

我正在使用WINDOWS 10 ORACLE 11g

1 个答案:

答案 0 :(得分: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;

干杯!