2015-01-06 2 views
3

У меня есть table_A, который имеет набор колонке A1, A2 и TABLE_B, который имеет множество столбцов B1, B2SQL: Союз двух таблиц, которые не имеют полное совпадение столбцов

Это случается, что A2=B1 но остальные столбцы не совпадают (и не должны). Я хотел бы добавить таблицу, поэтому я использую UNION ALL

Для не колоннах согласующих, я использую null as COLUMN_NAME, по обе стороны от UNION заявления

CREATE VIEW MY_VIEW AS 
SELECT 
TABLE_A.A1, 
TABLE_A.A2, 
null as B2 
from TABLE_A 
union all 
SELECT 
null as A1, 
TABLE_B.B1 as A2, 
TABLE_B.B2 as B2 
from TABLE_B; 

который выводит следующее сообщение об ошибке:

Error report: SQL Error: ORA-01790: expression must have same datatype as corresponding expression 01790. 00000 - "expression must have same datatype as corresponding expression" 

Это из-за нулей?

+0

проблема заключается в том, что вы разместили столбцы в другом порядке, в каждой половине союза. Столбцы должны совпадать в том же порядке между двумя половинами. – chridam

+0

Не могу сказать, предполагаем ли мы, что типы a2 и b1 одинаковы. –

+0

они такого же типа – Stephane

ответ

7

Вам необходимо явно наложить NULL на соответствующие типы в верхнем SELECT.

CREATE VIEW MY_VIEW AS 
SELECT 
TABLE_A.A1, 
TABLE_A.A2, 
CAST(null AS <type_of_TABLE_B_B2>) as B2 
from TABLE_A 
union all 
SELECT 
null, 
TABLE_B.B1, 
TABLE_B.B2 
from TABLE_B; 

Что касается альтернатив, как @evilive говорит, что вы можете использовать фиксированные значения, как пустая строка ('') для типа VARCHAR или ноль для чисел, но на мой взгляд, явное приведение лучшее решение, потому что это очевидно и не будет вызывать сюрпризы

SQLFiddle

+0

Это единственный способ или есть альтернативный вариант? У меня более 50 столбцов, поэтому мне бы хотелось избежать некоторых бросков – Stephane

+0

@Stephane - вам нужно всего лишь указать явные null, а не все столбцы; и только в первой ветви профсоюза (как упомянул Тони Хопкинсон, алиасы не используются во второй ветви). Предположительно, у вас есть только небольшая пропорция, не все 50. –

+1

нужно попробовать :) Я в настоящее время жду SQLFiddle для создания схемы примера и попробую несколько вариантов –

Смежные вопросы