Давайте предположим упрощенный пример, как показано ниже
Table1
![enter image description here](https://i.stack.imgur.com/KMTec.png)
Mappingtable
![enter image description here](https://i.stack.imgur.com/L3J3V.png)
То, как я подхожу к вашему варианту использования вручную , будет таким, как показано ниже
Во-первых, предположим, что мы заранее знаем все отображения и можем вручную собрать необходимый список и использовать его, как показано ниже
#standardSQL
CREATE OR REPLACE TABLE `project.dataset.Table1` AS
SELECT NULL AS Role_number, NULL AS Person_name -- this line to be generated
FROM (SELECT 1) WHERE FALSE UNION ALL
SELECT * FROM `project.dataset.Table1`
Теперь нам нужно «разобраться», как сгенерировать нижнюю строку из вышеприведенного запроса
'SELECT NULL AS Role_number, NULL AS Person_name'
Это можно сделать, выполнив запрос ниже
#standardSQL
SELECT CONCAT('SELECT', STRING_AGG(CONCAT(' NULL AS ', RealColumnName) ORDER BY pos)) select_statement
FROM (
SELECT TO_JSON_STRING(t) AS cols FROM `project.dataset.Table1` t LIMIT 1
), UNNEST(REGEXP_EXTRACT_ALL(cols, r'"(.*?)":')) col WITH OFFSET AS pos
LEFT JOIN `project.dataset.Mappingtable` ON tempColumnName = col
Это даст именно ту строку, которая нам нужна
'SELECT NULL AS Role_number, NULL AS Person_name'
Итак, теперь вопрос в том, как добавить выше динамически построенный фрагмент в интересующий нас запрос!
К сожалению, это не выполнимо как один запрос исключительно внутри BigQuery, но супер простая задача для выполнения в ЛЮБОМ клиенте или инструменте по вашему выбору
Я могу продемонстрировать, как легко это может сделать нетехнический пользователь с помощью выбранного мной инструмента - Magnus (входит в Potens.io - Набор инструментов для BigQuery)
Ниже приведен снимок рабочего процесса Magnus с двумя задачами BigQuery, которые воспроизводят точно описанные выше шаги
![enter image description here](https://i.stack.imgur.com/4myyy.png)
Как вы можете видеть здесь:
В первой задаче мы генерируем оператор с ожидаемыми сопоставленными именами столбцов и присваиваем результат параметру с именем var_columns_list
(после выполнения рабочего процесса он получит ожидаемое значение)
Во второй Задаче мы просто строим динамический sql, используя этот параметр
Также вы можете заметить, что вместо простой ссылки на таблицы типа project.dataset.Table1
и project.dataset.Mappingtable
- я использую <var_project_dataset>.Table1
и <var_project_dataset>.Mappingtable
, а параметр var_project_dataset
устанавливается на панели параметров
После запуска этого рабочего процесса мы получаем ожидаемый результат, как показано ниже
Пока до казни было
![enter image description here](https://i.stack.imgur.com/1FLGJ.png)
Очевидно, что это упрощенный пример, и он будет работать КАК ЕСТЬ, только если у вас есть базовые типы столбцов - без структур и массивов. Тем не менее, хорошая новость заключается в том, что этот подход будет легко обрабатывать 200 или более столбцов, которые вы упомянули в своем вопросе.
В любом случае, я думаю, что приведенный выше пример может стать хорошим началом для вас!
Раскрытие информации: я являюсь автором и руководителем команды Potens.io, что отражено в моем профиле. Я также являюсь экспертом Google Developer по облачной платформе и являюсь автором расширения BigQuery Mate Chrome