BigQuery Standard SQL автоматически заменяет ноль на ноль при левом соединении - PullRequest
0 голосов
/ 29 октября 2019

Я работаю с двумя таблицами в BigQuery, которые примерно соответствуют следующему формату:

t1

p1   num1
joe  25
tom  35
tim  20

t2

p1   num2
joe  15
tom  13

.. и мне нужно выполнить левое соединение. Обратите внимание, что имена в t2 не совпадают с именами в t1, и когда я выполняю это левое соединение t2 на t1, я бы хотел, чтобы num2 был нулевым, а не нулевым.

SELECT 
  t1.p1, t1.num, t2.num
FROM t1
LEFT JOIN t2 ON t1.p1 = t2.pi

Мне известна функция IFNULL, однако я предпочел бы избежать следующего решения:

SELECT 
  t1.p1, t1.num, IFNULL(t2.num, 0)
FROM t1
LEFT JOIN t2 ON t1.p1 = t2.p1

Причина этого в том, что у меня очень большой запрос с ~ 5осталось объединений и ~ 50 столбцов, и для всех 50 из этих столбцов нулевые значения должны быть заменены нулями . Я заметил, что BigQuery значительно отстает, когда я заменяю все строки t2.num в select на IFNULL(t2.num, 0).

Я хотел бы избежать решения, которое решает проблему на уровне столбцов (например, 50 столбцов, нуждающихся в IFNULL), и очень предпочел бы решение, которое обращается к нулевым значениям на левом уровне соединения (для 5 таблиц).

Буду очень признателен за любые мысли по этому поводу!

РЕДАКТИРОВАТЬ: Любые мысли о том, почему 50 IFNULL отстают редактор BigQuery, будет принята с благодарностью. Под отставанием редактора я буквально подразумеваю, что когда я пытаюсь ввести текст в редакторе запросов, то, что я печатаю, появляется несколько секунд. IFNULL не изменяют объем данных, обрабатываемых запросом (~ 1 ГБ), поэтому я был удивлен, что они вызвали такое большое отставание. Понимание этой проблемы может помочь мне в будущем написать более качественные запросы.

EDIT2 : Теперь я понимаю, что мой общий пример кода бесполезен. Пожалуйста, дайте мне знать, если более длинный пример кода поможет с проблемой.

1 Ответ

1 голос
/ 29 октября 2019

Не уверен, что у меня возникла корневая проблема - но вы можете изучить ниже опцию / направление (это исключает использование IFNULL, но потребует некоторых дополнительных усилий при создании этих дополнительных объединений для большего количества левого объединения, чем в простом примере)

#standardSQL
SELECT t1.p1, t1.num num1, t2.num num2
FROM t1 JOIN t2 ON t1.p1 = t2.p1 
UNION ALL
SELECT p1, num, 0 FROM t1 WHERE NOT EXISTS (
  SELECT 1 FROM t2 WHERE p1 = t1.p1
)

применительно к выборочным данным из вашего вопроса - результат

Row p1  num1    num2     
1   tim 20      0    
2   joe 25      15   
3   tom 35      13   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...