2013-08-02 4 views
1

У меня есть эта проблема. Существует n таблиц, созданных динамически, и каждая таблица имеет m столбцов, столбцы могут быть повторены. Эти таблицы имеют 2 столбца, но между ними нет соответствующих данных, например: Таблица 1 | A | B | Col1 | Col2 |SQLite Union из n таблиц с m столбцами

Table2 

| A | B | Col3 | Col4 |

Table3 

| A | B | Col1 | Col2 | Col4 |

То, что я хочу сделать, это объединить все таблицы в один большой, как это:

BigTable 

| A | B | Col1 | Col2 | Col3 | Col4 |

И все строки объединены, например, если в таблице 1 rows = 5, table2 rows = 3, table3 rows = 2, большая таблица будет содержать 10 записей.

Я могу сделать это с помощью запроса, как это:

SELECT A, B, Col1, Col2, null as Col3, null as Col4 FROM Table1 
UNION 
SELECT A, B, null as Col1, null as Col2, Col3, Col4 FROM Table2 
UNION 
SELECT A, B, Col1, Col2, null as Col3, Col4 FROM Table3 

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

+0

Если в таблице 1 было 3 строки, а таблица2 имела 3 строки, сколько строк было бы большой таблицей? –

+0

у него будет 6 строк –

ответ

2

Единственное улучшение вашего запроса - использовать union all вместо union. Используйте только union если вы явно хотите удалить дубликаты, потому что он всегда пытается:

SELECT A, B, Col1, Col2, null as Col3, null as Col4 FROM Table1 
UNION ALL 
SELECT A, B, null as Col1, null as Col2, Col3, Col4 FROM Table2 
UNION ALL 
SELECT A, B, Col1, Col2, null as Col3, Col4 FROM Table3; 

EDIT:

Вы можете еще больше упростить это:

SELECT A, B, Col1, Col2, null as Col3, null as Col4 FROM Table1 
UNION ALL 
SELECT A, B, null, null, Col3, Col4 FROM Table2 
UNION ALL 
SELECT A, B, Col1, Col2, null, Col4 FROM Table3; 

Имена столбцов используются только для первого select в union all. После этого столбцы идентифицируются положением.

EDIT II:

Существует трюк, который вы можете использовать, чтобы получить «логический» матчи на union all. Мне это особенно не нравится, но вам не нужно перечислять столбцы для всех подзапросов.Тем не менее, select является более сложным, и он имеет другой подзапрос, и вы все еще нужно подзапросы:

select coalesce(t1.A, t2.A, t3.A) as A, 
     coalesce(t1.B, t2.B, t3.B) as B, 
     coalesce(t1.Col1, t2.Col1, t3.Col1) as col1, 
     coalesce(t1.Col2, t2.Col2, t3.Col2) as col2, 
     coalesce(t1.Col3, t2.Col3, t3.Col3) as col3 
from (select 'Table1' as tablename union all 
     select 'Table2' union all 
     select 'Table3' 
    ) driver left outer join 
    (select t.*, 'Table1' as tablename 
     from Table1 
    ) t1 
    on t1.tablename = driver.tablename left outer join 
    (select t.*, 'Table2' as tablename 
     from Table2 
    ) t2 
    on t2.tablename = driver.tablename left outer join 
    (select t.*, 'Table3' as tablename 
     from Table3 
    ) t3 
    on t3.tablename = driver.tablename; 
+0

Ничего, поэтому нет способа объединения всех таблиц без указания столбцов? –

+0

Мне нравится упрощенная версия, вторая выглядит неплохо, но сложно, я попробую оба, спасибо за вашу помощь :) –

0

Вы можете сделать это (используя пример таблицы для упрощения),

table1 является,

col1 | col2 | col3 

table2 есть

col3 | col4 | col5 

Теперь выполнить объединение,

select col1, col2, col3, '' as col4, '' as col5, from table1 
union 
select '' as col1, '' as col2, col3, col4, col5 from table2 

Конечно, вы получите пустые значения из столбцов col4 и col5, когда источник строк были из table1, и пустых значений для col1 и col2, когда источник строки были из table2.

Замените любое значение по умолчанию, которое вы хотите для пустых значений. В моем примере используется пустая строка, но вы также можете использовать 0, null, что угодно.

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