SQL UNNEST требует псевдонима? - PullRequest
       4

SQL UNNEST требует псевдонима?

0 голосов
/ 23 октября 2018

Я изучаю SQL и пытаюсь понять UNNEST.В таблице событий FireBase со следующей схемой:

event_params    RECORD  REPEATED    
event_params. key   STRING  NULLABLE    
event_params. value RECORD  NULLABLE    
event_params.value. string_value    STRING  NULLABLE    
event_params.value. int_value   INTEGER NULLABLE    

Это работает:

SELECT params.key, params.value.string_value, params.value.int_value
FROM `...events_20181021`, 
   UNNEST(event_params) as params

Далее, когда я запускаю

SELECT *
FROM `...events_20181021`, 
   UNNEST(event_params)

я вижу столбцы типа event_params.key, event_params.value.string_value, event_params.value.int_value (в BigQuery).Но когда я пытаюсь

SELECT event_params.key, event_params.value.string_value, event_params.value.int_value
FROM `...events_20181021`, 
   UNNEST(event_params)

, это терпит неудачу.Почему?

Редактировать: см. https://stackoverflow.com/a/51563922/1908650 для примера UNNEST, используемого без псевдонима.

1 Ответ

0 голосов
/ 23 октября 2018

Я попытаюсь объяснить
Буду использовать ниже CTE с моими примерами

WITH `table` AS (
  SELECT 1 id, [STRUCT<key STRING, value STRUCT<string_value STRING, int_value INT64>>('a', ('1',1)),('b', ('2',2)),('c', ('3',3))] params UNION ALL
  SELECT 2, [STRUCT<key STRING, value STRUCT<string_value STRING, int_value INT64>>('x', ('666', 666)),('y', ('777',777))]
)

Пример # 1 - простой SELECT *

#standardSQL
SELECT * 
FROM `table`   

это дает ниже [очевидно ожидаемый] результат

Row id  params.key  params.value.string_value   params.value.int_value   
1   1   a           1                           1    
        b           2                           2    
        c           3                           3    
2   2   x           666                         666  
        y           777                         777  

Пример # 2 - UNNEST без псевдонима

#standardSQL
SELECT * 
FROM `table`, UNNEST(params)   

результат будет

Row id  params.key  params.value.string_value   params.value.int_value  key value.string_value  value.int_value  
1   1   a           1                           1                       a   1                   1    
        b           2                           2                
        c           3                           3                
2   1   a           1                           1                       b   2                   2    
        b           2                           2                
        c           3                           3                
3   1   a           1                           1                       c   3                   3    
        b           2                           2                
        c           3                           3                
4   2   x           666                         666                     x   666                 666  
        y           777                         777              
5   2   x           666                         666                     y   777                 777  
        y           777                         777              

теперь вы можете видеть два дополнительных столбца с именами key и value (значение STRUCT с двумя полями соответственно string_value и int_value), которые следовали после имен соответствующих полей STRUCT, полученных в результате UNNEST'ing ARRAYSTRUCT.
ВАЖНО: столбцы, начинающиеся с params, на самом деле являются частью REPEATED RECORD и не могут быть доступны напрямую, тогда как на те поля, которые являются результатом UNNEST'ing, можно напрямую ссылаться (если некоторые из них не являются массивами (s) сами по себе, в этом случае понадобится второе UNNEST)

Итак, короткая история - мы можем просто ссылаться на них как key и value - например,

Пример № 3 - см.Включение «унаследованных» имен полейесли есть другое поле с именем (например) `ключ ', то вы хотите иметь возможность обратиться к этому

#standardSQL
SELECT id AS key, param.key AS param_key, value
FROM `table`, UNNEST(params) param     

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

Row key param_key   value.string_value  value.int_value  
1   1   a           1                   1    
2   1   b           2                   2    
3   1   c           3                   3    
4   2   x           666                 666  
5   2   y           777                 777  

Надеюсь, что выше, поможет вамподружитесь с UNNEST: o)

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

Пример # 5 - случай, когда требуется псевдоним

Если вам нужно UNNEST простой массив, как показано ниже CTE, единственный способ ссылаться на плоский элемент - ТОЛЬКО через псевдоним

WITH `project.dataset.table` AS (
  SELECT 1 id, [1,2,3] params UNION ALL
  SELECT 2, [666,777]
)

например

#standardSQL
SELECT id, param
FROM `project.dataset.table`, UNNEST(params) param
WHERE NOT param IN (2,777)

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

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