BigQuery: объединение / объединение двух таблиц с множеством столбцов, некоторые перекрываются - PullRequest
0 голосов
/ 02 мая 2019

У меня есть две большие таблицы с несколькими перекрывающимися столбцами, некоторые из которых содержат одинаковые значения в перекрывающихся столбцах. Вот игрушечный пример (в реальном примере есть десятки столбцов, как перекрывающих друг друга, так и нет):

Table 1: a, b, c

Table 2: a, d, e

Некоторые значения a находятся только в одной таблице, некоторые - в обеих.

Есть ли запрос, который позволит мне сгенерировать таблицу со всеми доступными значениями:

Table 3: a, b, c, d, e

Мой текущий запрос требует перечисления каждого столбца, который очень многословен с десятками столбцов и негибок при изменении схемы:

SELECT
  coalesce(t1.a,
    t2.a) AS a,
  t1.b,
  t1.c,
  t2.d,
  t2.e
FROM
  t1
FULL JOIN
  t2
USING
  (a)

Вещи, которые я пробовал: UNION, кажется, требует ту же схему, SELECT t1.*, t2.* вызывает ошибку на перекрывающихся столбцах, SELECT t1.* ... USING (a) выдаст пустые значения для значений в a, где есть значения только в t1.a .

1 Ответ

2 голосов
/ 02 мая 2019

До того, как BigQuery Standard SQL стал доступен для всех нас 2 июня 2016 года, я был чрезвычайно доволен тем, что теперь называется BigQuery Legacy SQL.Я все еще наслаждаюсь этим время от времени для некоторых конкретных случаев использования

Я думаю, что случай, который вы описали в своем вопросе, как раз тот, где вы можете использовать функцию Legacy SQL для решения вашей проблемы

Итак,ниже для BigQuery Legacy SQL

#legacySQL
SELECT * 
FROM [project:dataset.table1],
  [project:dataset.table2]

Примечание: в BigQuery Legacy SQL запятая - , - означает UNION ALL

Упрощенный пример выше

#legacySQL
SELECT * 
FROM (SELECT1 a, 2 b, 3 c, 11 x),
 (SELECT 1 a, 4 d, 5 e, 12 x)   

с результатом

Row     a   b       c       x       d       e    
1       1   2       3       11      null    null     
2       1   null    null    12      4       5    

Примечание: вы не можете смешивать Legacy и Standard SQL в одном запросе, поэтому, если вам нужно использовать стандартный SQL для приведенного UNION - вам сначала нужно будет материализовать (сохранить) результат кактаблицу, а затем запросить эту таблицу с помощью стандартного SQL

Есть ли способ с помощью стандартного SQL

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...