Почему мой подзапрос работает со строкой, а не со ссылкой на поле? - PullRequest
1 голос
/ 08 июня 2019

У меня есть (что я думаю) довольно сложный запрос.Запрос получает запись, которую я хочу, а затем все данные, указанные в первом ответе.Это работает, если моим условным подзапросом является строка, но не если это поле (с точно таким же значением).

// Query with string as conditional in lowest sub-query (4th line from the bottom)

SELECT 
     e1.entity as entity
    ,ARRAY_CAT(
      ARRAY_COMPACT( 
        ARRAY_CONSTRUCT( 
          any_value(e2.entity), 
          any_value(u1.user) 
        )
      )
      ,ARRAY_AGG(e3.entity)
    ) as includes
FROM ENTITIES e1
LEFT JOIN ENTITIES e2 ON e1.entity:owner:workspace = e2.entity:id
LEFT JOIN USERS u1 ON e1.entity:owner:user = u1.user:id
LEFT JOIN ENTITIES e3 ON e3.entity:id IN (
  SELECT ee2.value FROM 
  table(FLATTEN( input=> 
    SELECT SPLIT(LISTAGG( CASE WHEN IS_ARRAY(ee1.value:id) THEN ARRAY_TO_STRING(ee1.value:id, ',') ELSE ee1.value:id END, ','), ',') 
    FROM table(FLATTEN( input => ( SELECT e4.entity:relationships:entities FROM ENTITIES e4 WHERE e4.entity:id = 'bd265f29-ca32-449a-b765-bb488e4d6b3c' ) )) ee1
  )) ee2
)
GROUP BY e1.entity

Выше приведено:

столбец "entity":https://jsonblob.com/6d98b587-8989-11e9-b738-a9487a0dac0b

«включает» столбец: https://jsonblob.com/068a8672-8988-11e9-b738-77f0e471310b

Однако, если я изменю строку uuid (bd265f29-ca32-449a-b765-bb488e4d6b3c) на e1.entity:id (ниже), то получуошибка SQL compilation error: Unsupported subquery type cannot be evaluated.

SELECT 
     e1.entity as entity
    ,ARRAY_CAT(
      ARRAY_COMPACT( 
        ARRAY_CONSTRUCT( 
          any_value(e2.entity), 
          any_value(u1.user) 
        )
      )
      ,ARRAY_AGG(e3.entity)
    ) as includes
FROM ENTITIES e1
LEFT JOIN ENTITIES e2 ON e1.entity:owner:workspace = e2.entity:id
LEFT JOIN USERS u1 ON e1.entity:owner:user = u1.user:id
LEFT JOIN ENTITIES e3 ON e3.entity:id IN (
  SELECT ee2.value FROM 
  table(FLATTEN( input=> 
    SELECT SPLIT(LISTAGG( CASE WHEN IS_ARRAY(ee1.value:id) THEN ARRAY_TO_STRING(ee1.value:id, ',') ELSE ee1.value:id END, ','), ',') 
    FROM table(FLATTEN( input => ( SELECT e4.entity:relationships:entities FROM ENTITIES e4 WHERE e4.entity:id = e1.entity:id ) )) ee1
  )) ee2
)
GROUP BY e1.entity

Я понятия не имею, почему коммутатор вызывает ошибку.Почему мой подзапрос работает со строкой, а не со ссылкой на поле?

Ответы [ 3 ]

0 голосов
/ 11 июня 2019

Вы пытались разыграть это так?

e1.entity:id::string
0 голосов
/ 15 июня 2019

Документация Snowflake упоминает:

Подзапросы с корреляцией внутри FLATTEN в настоящее время не поддерживаются.

Вы не можете просто использовать вместо e1.entity: Relations: entity вместоподзапроса?

0 голосов
/ 08 июня 2019

Документация Snowflake для подзапросов включает это ограничение:

Коррелированные скалярные подзапросы в настоящее время поддерживаются только в том случае, если они могут быть статически определены для возврата одной строки (например, если список SELECT содержит статистическую функцию без GROUP BY).

Так что вы можете попробовать:

( SELECT MAX(e4.entity:relationships:entities)
  FROM ENTITIES e4
  WHERE e4.entity:id = e1.entity:id
)
...