有两个查询,我需要输出作为使用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中使用任何增量值,以便数据类型在两个查询之间匹配?
答案 0 :(得分:2)
问题在于map_id
与map_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)