Проходить и комбинировать схемы / таблицы с UNION_ALL - PullRequest
0 голосов
/ 07 июня 2018

Я хочу объединить таблицы из разных схем, используя UNION_ALL.Таблицы имеют одинаковую схему, как в этом игрушечном примере:

class1.names
+----------+
| id | name|
+----------+
| 1  | jon |
| 2  | ann |
| 3  | rob |

class2.names
+----------+
| id | name|
+----------+
| 1  | rav |
| 2  | meg |
| 3  | mat |

Я могу жестко закодировать список классов в массив или, что более предпочтительно, получить их с помощью запроса, например:

SELECT DISTINCT(TABLE_SCHEMA)
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE = 'BASE TABLE'

Я хочу объединить таблицы следующим образом:

SELECT *, 'class1' as class FROM class1.names
UNION_ALL
SELECT *, 'class2' as class FROM class2.names
UNION_ALL
etc.

Но в запросах уровня схемы будет происходить намного больше, чем SELECT *, 'class1'..., поэтому я хочу сделать это с помощью циклаили какой-то другой систематический метод.

Я смотрю на динамический sql или использую GROUP_CONCAT с 'UNION_ALL' в качестве разделителя, но у меня возникают проблемы с прогрессом.

Добавление: я знаю этоплохой дизайн схемы, но сейчас я ничего не могу с этим поделать.

1 Ответ

0 голосов
/ 08 июля 2019

Если я правильно вас понял:

select listagg('select ' || f.value, ' union all ') from table(flatten(input => parse_json(
                                                    '[1, ,77]'))) f;
+----------------------------------------------+
| LISTAGG('SELECT ' || F.VALUE, ' UNION ALL ') |
|----------------------------------------------|
| select 1 union all select 77                 |
+----------------------------------------------+
1 Row(s) produced. Time Elapsed: 0.739s

и чем:

select 1 union all select 77;
+----+
|  1 |
|----|
|  1 |
| 77 |
+----+
2 Row(s) produced. Time Elapsed: 0.638s
...