将两个表与不同的列组合在一起

时间:2012-01-26 07:44:07

标签: oracle zend-framework plsql union

我必须使用UNION选择我想要组合的请求:

表1 :这是Table_a,table_b和table_c之间的连接

id_table_a   desc_table_a   table_b.id_user  table_c.field
-----------------------------------------------------------
1            desc1            1                 field1
2            desc2            2                 field2
3            desc3            3                 field3

表2 :这也是Table_a,table_b和table_c之间的连接,但它有以下列:

id_table_a   desc_table_a   table_c.id_user  table_c.field
-----------------------------------------------------------
4            desc4            4                 field4
5            desc5            5                 field8
9            desc9            6                 field9

两者之间的差异在于表1中我们有table_b.id_user和表2 而是table_c.id_user

合并表

  id_table_a   desc_table_a     id_user  table_c.field
    -----------------------------------------------------------
    1            desc1            1                 field1
    2            desc2            2                 field2
    3            desc3            3                 field3
    4            desc4            4                 field4
    5            desc5            5                 field5
    9            desc9            6                 field6

我已经有了加入请求,但两者之间的联合让我

ORA-01790 expression must have same datatype as corresponding expression

这是有道理的,因为两列不一样。

我正在使用zend_Db的join和union。

那我怎么解决这个问题才能得到结果?

感谢。

1 个答案:

答案 0 :(得分:11)

结果是否与表格中的列序列相同?因为oracle在列顺序中是严格的。以下示例产生错误:

create table test1_1790 (
col_a varchar2(30),
col_b number,
col_c date);

create table test2_1790 (
col_a varchar2(30),
col_c date,
col_b number);

select * from test1_1790
union all
select * from test2_1790;

ORA-01790:表达式必须与对应表达式具有相同的数据类型

正如您所看到的,错误的根本原因在于使用*作为列列表说明符所暗示的不匹配列排序。通过明确输入列列表可以轻松避免此类错误:

select col_a, col_b, col_c from test1_1790
union all
select col_a, col_b, col_c from test2_1790;

此错误的更常见情况是当您无意中交换(或转移)SELECT列表中的两个或更多列时:

select col_a, col_b, col_c from test1_1790
union all
select col_a, col_c, col_b from test2_1790;

或者,如果以上问题无法解决您的问题,那么如何在列中 ALIAS 像这样:(查询与你的查询不一样,但这里的重点是如何在列中添加别名。)

SELECT id_table_a, 
       desc_table_a, 
       table_b.id_user as iUserID, 
       table_c.field as iField
UNION
SELECT id_table_a, 
       desc_table_a, 
       table_c.id_user as iUserID, 
       table_c.field as iField

希望这会有所帮助。