2015-12-14 63 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跳過唯一性篩選,加快查詢速度。

相關問題