sql - группировка по динамически выбранным именам таблиц - PullRequest
0 голосов
/ 01 марта 2019

У меня есть таблица app_to_tables, которая сопоставляет приложения и имена таблиц, имена таблиц около 20, поэтому я не могу жестко их кодировать в запросе.Здесь для простоты я поместил только 2 имени таблицы (table_1, table_2).Структура таблицы следующая:

+--------+------------+
 | app_id | table_name |
 +--------+------------+
 |      1 | table_1    |
 |      1 | table_2    |
 |      2 | table_1    |
 |      2 | table_2    |
 +--------+------------+

с другой стороны, у меня есть еще одна таблица, которая называется table_1, table_2, table_3.Схемы для этих таблиц одинаковы, а их содержимое следующее:

table_1
+------------+--------+--------+
|    date    | app_id | signal |
+------------+--------+--------+
| 2018-01-01 |      1 | sg     |
| 2018-01-01 |      1 | sg     |
| 2018-01-01 |      2 | sg     |
| 2018-01-01 |      2 | sg     |
| 2018-01-02 |      1 | sg     |
| 2018-01-02 |      1 | sg     |
+------------+--------+--------+

table_2
+------------+--------+--------+
|    date    | app_id | signal |
+------------+--------+--------+
| 2018-01-01 |      1 | sg     |
| 2018-01-01 |      2 | sg     |
| 2018-01-01 |      2 | sg     |
| 2018-01-01 |      2 | sg     |
| 2018-01-02 |      1 | sg     |
| 2018-01-02 |      2 | sg     |
+------------+--------+--------+

Я пытаюсь получить результат запроса sql, который будет следующим: Количество сигналов на каждый date накаждый table_name за каждый app_id, как показано ниже:

+--------+------------+------------+-------+
| app_id | table_name |    date    | count |
+--------+------------+------------+-------+
|      1 | table_1    | 2018-01-01 |     2 |
|      1 | table_1    | 2018-01-02 |     2 |
|      1 | table_2    | 2018-01-01 |     1 |
|      1 | table_2    | 2018-01-02 |     1 |
|      2 | table_1    | 2018-01-01 |     2 |
|      2 | table_2    | 2018-01-01 |     3 |
|      2 | table_2    | 2018-01-02 |     1 |
+--------+------------+------------+-------+

Моя главная проблема в том, как я могу выбрать имена таблиц и затем динамически (без жесткого кодирования имен таблиц в запросе) использовать эту таблицуимена для подсчета количества сигналов.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Моя главная проблема в том, как я могу выбрать имена таблиц, а затем динамически (без жесткого кодирования имен таблиц в запросе) использовать эти имена таблиц для подсчета количества сигналов.

К сожалению, это невозможно в SQL.SQL требует, чтобы запрос явно именовал все таблицы до запроса.Вы не можете написать какой-либо SQL-запрос, который динамически присоединяется к дополнительным таблицам в зависимости от того, какие значения он обнаруживает при сканировании данных во время выполнения.

Для SQL это не имеет больше смысла, чем запрос кода, вызывающего некоторую функцию,чье имя на самом деле является возвращаемым значением функции.Как и в PHP, вы можете вызвать функцию, имя которой основано на переменной.Но вы явно не могли вызвать функцию, имя которой является результатом функции, которую вы вызываете.

$result = $result(); // this is a paradox

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

SELECT DISTINCT table_name FROM app_to_tables;

Это дает вам краткий список имен таблиц (возможно, около 20 таблиц в вашем случае).Затем вы должны написать код для построения запроса SQL в виде строки из этого списка.

По сути, как решение, данное @ThomasG в этом потоке.

0 голосов
/ 01 марта 2019

СОЮЗ - твой друг

SELECT app_id, table_name, date, count(*)
FROM
( 
SELECT 'table_1' AS table_name, date, app_id FROM table_1
UNION ALL
SELECT 'table_2' AS table_name, date, app_id FROM table_2
UNION ALL
SELECT 'table_3' AS table_name, date, app_id FROM table_3
) U
GROUP BY app_id, table_name, date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...