2015-12-14 36 views
0

有两个查询,其输出我需要作为使用联合所得组但在一个查询有map_id这是数据类型VARCHAR2(60),并在查询2此列中缺少的。 Map_id实际上是存储在正在使用的表格中的一个序列。查询2具有没有MAP_ID为了这个,我已经写了类似的表:表达必须具有相同的数据类型在UNION子句

select * from 
    (select map_id,person_id,emp_num from table_abc) 
UNION 
    (SELECT ROWID MAP_ID , PERSON_ID, EMP_NUM FROM TABLE_XYZ) 

现在的错误来了:

ORA-01790: expression must have same datatype as corresponding expression 
01790. 00000 - "expression must have same datatype as corresponding expression" 
*Cause:  
*Action: 
Error at Line: 2 Column: 9 

我怎样才能查询2使用任何增量值,以使数据类型两个查询之间的匹配?

回答

0

看起来您在查询1中选择了3个值map_id,person_id,emp_num,在查询2中选择了4个值ROWID MAP_ID,PERSON_ID,EMP_NUM以及第二个查询中的语法错误。在查询2

中,RowID和Map_ID不是分开的,所以你有错误。

如果你想从第二个查询中显示ROWID,查询1创建ROWID虚拟列像下面

SELECT * FROM (SELECT 'ROWID' = NULL 
       ,map_id 
       ,person_id 
       ,emp_num    FROM table_abc  ) UNION (SELECT ROWID 
     ,MAP_ID 
     ,PERSON_ID 
     ,EMP_NUM  FROM TABLE_XYZ) 
+1

Hi @ karthik.venkatramana - No query 2 has rowid as map_id,so that there is a incremented sequence in query 2 .... –

+1

@ divya.trehan573是你的列名rowid map_id?如果是,那么请将该列转换为适当的数据类型。它会工作。类似cast(rowid map_id AS float)。否则,如果列名只是rowid或map_id,则可以直接使用它。也让我们知道什么是列的数据类型,以便我们可以帮助你。 –

0

使用cast()如下:

select * from 
    (select map_id,person_id,emp_num from table_abc) 
    UNION 
    (SELECT cast(ROWID AS varchar(20)) as MAP_ID , PERSON_ID, EMP_NUM FROM TABLE_XYZ) 
2

的问题是, ROWID具有从map_id不同类型,map_id任何类型,因为ROWID生成单独的类型的列。

由于map_id类型的东西到ROWID可以投,可以通过铸造ROWIDvarchar2(60)解决这个问题:

select * from 
    (SELECT map_id, person_id, emp_num FROM table_abc) 
UNION 
    (SELECT CAST(ROWID AS VARCHAR2(60)) MAP_ID, PERSON_ID, EMP_NUM FROM TABLE_XYZ) 

如果map_id预计不会有可能匹配任何ROWID值s从另一张表中考虑使用UNION ALL而不是UNION。这将让Oracle跳过唯一性筛选,加快查询速度。

相关问题