Объединение двух таблиц с другим столбцом - PullRequest
2 голосов
/ 26 января 2012

Я должен выбрать запросы, которые я хочу объединить, используя 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 и таблицу два 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.

Так, как я могу решить это, чтобы получить результат?

Спасибо.

1 Ответ

11 голосов
/ 26 января 2012

Результаты выше совпадают с последовательностью столбцов в вашей таблице?потому что оракул строг в порядках столбцов.этот пример ниже выдает ошибку:

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

надеюсь, это поможет.

...