【问题标题】:view datatypes to resolve ORA-01790: expression must have same datatype as corresponding expression查看数据类型以解决 ORA-01790: 表达式必须具有与相应表达式相同的数据类型
【发布时间】:2017-01-30 23:43:06
【问题描述】:

我正在尝试合并三个表,每个表都应该具有相同的列和相同的数据类型:

select *
from ALL_1
union all
select *
from ALL_2
union all
select *
from ALL_3
/

我不断收到“ORA-01790:表达式必须具有与相应表达式相同的数据类型”,因此显然其中一张表中的数据类型之一是不同的。每个表应该有 40 列。我想并排查看每列的数据类型,以便搜索差异。我该怎么做?

【问题讨论】:

  • 列可能在原始 DDL 中以不同的顺序声明。为什么不直接编写一个查询,JOINs 使用公共键上的表并尝试找出差异?

标签: sql oracle ora-01790


【解决方案1】:

在 SQL*Plus、SQL Developer、Toad 中,您可以使用 SQL*Plus 命令DESCRIBE

例如:

SQL> describe scott.emp

 Name                                              Null?    Type
 ------------------------------------------------- -------- ------------------------
 EMPNO                                             NOT NULL NUMBER(4)
 ENAME                                                      VARCHAR2(10)
 JOB                                                        VARCHAR2(9)
 MGR                                                        NUMBER(4)
 HIREDATE                                                   DATE
 SAL                                                        NUMBER(7,2)
 COMM                                                       NUMBER(7,2)
 DEPTNO                                                     NUMBER(2)

否则您可以查询目录表。这种方法可能更好,因为您可以编写代码来为您进行检查(以准确找到差异所在),而不是手动进行。

SQL> select column_name, data_type, data_length, data_precision, data_scale
  2  from   all_tab_columns
  3  where  owner = 'SCOTT' and table_name = 'EMP'
  4  order by column_id;

COLUMN_NAME      DATA_TYPE          DATA_LENGTH DATA_PRECISION DATA_SCALE
---------------- ------------------ ----------- -------------- ----------
EMPNO            NUMBER                      22              4          0
ENAME            VARCHAR2                    10
JOB              VARCHAR2                     9
MGR              NUMBER                      22              4          0
HIREDATE         DATE                         7
SAL              NUMBER                      22              7          2
COMM             NUMBER                      22              7          2
DEPTNO           NUMBER                      22              2          0

8 rows selected.

例如,您可以在SELECT 子句中添加TABLE_NAMECOLUMN_ID,并将WHERE 子句更改为IN (....) 条件;添加order by column_id,然后检查输出 - 列应该出现在组中,首先来自所有三个表的第一列,然后来自所有三个表的第二列等。或者将代码写入count(distinct data_type)group by column_id,并查看哪些组计数大于 1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多