UNION子句

时间:2015-12-14 10:51:57

标签: sql oracle union

有两个查询,我需要输出作为使用union的结果集,但在一个查询中有map_id,其数据类型为varchar2(60),而在查询2中,此列缺失。 Map_id实际上是一个存储在表查询中使用的序列。查询2有一个没有map_id的表,我写了类似的东西:

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中使用任何增量值,以便数据类型在两个查询之间匹配?

3 个答案:

答案 0 :(得分:2)

问题在于map_idmap_id的类型不同,无论ROWID的类型如何,因为map_id会生成单独类型的列。

由于ROWID的类型可以投放到ROWID,因此您可以通过将varchar2(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的值不能与其他表中的任何UNION ALL匹配,请考虑使用UNION代替 public function getIndex(){ $category=DB::table('categories')->get(['id','name']); $sub=DB::table('subcategory')->where('category_id','=',$category)->get(['id','name','category_id']); return view ('contents.in')->with('category',$category) ->with('sub',$sub); } public function postIndex(Request $request){ $name=$request->input('name'); $sub_id=$request->input('sub_id'); $category_id=$request->input('category_id'); DB::table('incategory')->insert(['name'=>$name,'sub_id'=>$sub_id,'category_id'=>$category_id]); return redirect('/in'); } 。这将使Oracle跳过过滤以获得唯一性,从而加快查询速度。

答案 1 :(得分: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 )

答案 2 :(得分: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)