BigQuery ссылается на подзапрос в предложении WITH в предложении WHERE - PullRequest
0 голосов
/ 15 апреля 2020

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

WITH
  ListOfIds AS (
  SELECT
    Id
  FROM
    ...)
SELECT
  *
FROM
  ...
WHERE
  Id IN ListOfIds

Приведенный выше синтаксис приводит к ошибке ListOfIds не определено в строке Id IN ListOfIds

На данный момент наиболее близким является следующее, и мне не нравится его несколько сложный и избыточный синтаксис.

WITH
  ListOfIds AS (
  SELECT
    Id
  FROM
    ...)
SELECT
  *
FROM
  ...
WHERE
  Id IN (
  SELECT
    Id
  FROM
    ListOfIds)

Заранее спасибо за любую помощь или совет.

Ответы [ 3 ]

2 голосов
/ 15 апреля 2020

В дополнение к тому, что говорит Франческо, если вы действительно хотите использовать его как переменную, на самом деле это также возможно и, вероятно, совсем не дорого.

DECLARE ListOfIds ARRAY<INT64> DEFAULT (SELECT ARRAY_AGG(Id) FROM ...);

SELECT
  *
FROM
  ...
WHERE
  Id IN UNNEST(ListOfIds)
2 голосов
/ 15 апреля 2020

Во-первых, заметка. Вы, вероятно, не хотите делать это.

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

Я рекомендую заменить это на простой JOIN, он достигнет того же самого и, как правило, будет намного лучше.

В основном ваш запрос будет выглядеть так:

WITH list_of_ids AS (
   SELECT id FROM table_with_ids
)

SELECT main_table.*
FROM main_table 
JOIN list_of_ids
   ON main_table.id = list_of_ids.id

Я думаю, что это довольно чистый синтаксис и решает вашу проблему. Дайте мне знать, если мне чего-то не хватает, и я могу добавить к этому.

0 голосов
/ 15 апреля 2020

Ниже для BigQuery Standard SQL

#standardSQL
WITH ListOfIds AS (
  SELECT ARRAY_AGG(Id) ids
  FROM ...
)
SELECT * EXCEPT(ids) 
FROM ...
,ListOfIds
WHERE id IN UNNEST(ListOfIds.ids)   

[Super] Упрощенный пример для тестирования / игры с выше:

#standardSQL
WITH ListOfIds AS (
  SELECT ARRAY_AGG(Id) ids
  FROM UNNEST([1, 2, 3, 4, 5]) id
)
SELECT * EXCEPT(ids) 
FROM UNNEST([1, 3, 5, 7, 9]) id
,ListOfIds
WHERE id IN UNNEST(ids)   

с выводом

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