【问题标题】:ORA-01790 error on union; datatypes verifiedORA-01790 联合错误;已验证的数据类型
【发布时间】:2017-07-12 12:05:34
【问题描述】:

我在 'union all' 中加入 2 个大型查询(155 列)。通过创建每个查询的测试视图并并排比较名称和数据类型,我已经验证了联合的每一侧的列名和数据类型是相同的。

错误消息指向看似随机的行和列,但我已经仔细检查了这些列以确保数据类型 (varchar2(1300)) 相同。

有谁知道还有哪些其他因素可能引发此错误?运行Oracle 12c.

【问题讨论】:

  • 据我记得,名称并不重要(必须在 UNION 的第一个 SELECT 中定义,但在下一个中可以省略或不同)。重要的是两个查询返回相同的列数,并且对应的数据类型相同。
  • @etsa 这是正确的 - 例如此查询有效:select empno, ename from emp union select deptno, dname from dept; 所以问题一定出在数据类型上。
  • 明白名称不重要,但想表明联合两侧匹配的列数。 :)
  • 您有什么意见吗?
  • @etsa:没有 CASE 语句,但有 1 个 decode() 和几个 cast() 语句。

标签: oracle ora-01790


【解决方案1】:

既然你已经创建了这两个测试视图,为什么不让 oracle 比较列类型呢?

SELECT column_id, data_type FROM user_tab_cols
  WHERE table_name='MYVIEW1'
MINUS
SELECT column_id, data_type FROM user_tab_cols
  WHERE table_name='MYVIEW2';

这应该很快将您指向冲突的列。 (必要时交换 MYVIEW1 和 MYVIEW2)

【讨论】:

  • 好主意。我试过了,上面的查询没有返回任何行。 (两种方法都试过了)。
  • 奇怪...这里没有结果但是SELECT * FROM myview1 UNION SELECT * FROM myview2 导致错误01790?
  • 我会说你使用这个查询,因为上面写的并不详尽:SELECT 'MV1-MV2-1' as place, column_id, data_type FROM user_tab_cols WHERE table_name='MYVIEW1' MINUS SELECT 'MV1-MV2-2' as place, column_id, data_type FROM user_tab_cols WHERE table_name='MYVIEW2' union all SELECT 'MV2-MV1-3' as place, column_id, data_type FROM user_tab_cols WHERE table_name='MYVIEW2' MINUS SELECT 'MV2-MV1-4' as place, column_id, data_type FROM user_tab_cols WHERE table_name='MYVIEW1';
  • @g00dy:您在查询的每个部分中为 place 使用不同的值,因此,minus 不会做任何事情 ;-)
  • 你是对的 - 让那个溢出 :) 例如,前两个应该作为“1”,第三个和第四个应该作为“2”。应该这样做:))
猜你喜欢
  • 1970-01-01
  • 2010-12-24
  • 2020-05-20
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多