Arhn - архитектура программирования

Ошибка BigQuery. Просмотр X ссылается на себя

Я перехожу с legacySQL на standardSQL и получаю сообщение об ошибке относительно простого запроса, который работал в устаревшей версии.

Ошибка: «Просмотр myproject.mydataset.vw_1 ссылается на себя».

#standardSQL
SELECT a.LineItemID
FROM
  (
  SELECT
    LineItemID,
    EXTRACT(YEAR FROM DATE(`Date`)) AS Order_Year
  FROM
    `myproject.mydataset.vw_1`
  ) a  
LEFT JOIN
  `myproject.mydataset.vw_2` b
  ON
    b.Line_Item_ID = a.LineItemID
LEFT JOIN
  `myproject.mydataset.vw_3` c
  ON
    c.Line_Item_ID = a.LineItemID

Есть 2 представления (с псевдонимом b и c), присоединенные слева к 1 подзапросу (с псевдонимом a).

Обратите внимание, что vw_2 и vw_3 оба возвращают по 1 столбцу (Line_Item_ID), и оба они выбирают из myproject.mydataset.vw_1. Я подозреваю, что проблема связана с этими двумя представлениями, каждое из которых запрашивает одно и то же представление, но кажется странным, что он будет работать в устаревшем, а не стандартном режиме.

Если я закомментирую либо соединение с псевдонимом таблицы b, либо псевдонимом таблицы c, запрос будет работать и вернет a.LineItemID. Это дает только ошибку «view X is self-referencing», когда оба b и c соединены.

Я попытался заменить соединения на b и c подобными подзапросами, в которых указывается имя столбца Line_Item_ID, но это дает ту же ошибку.

LEFT JOIN
  (select Line_Item_ID from `myproject.mydataset.vw_2) b
  ON
    b.Line_Item_ID = a.LineItemID
LEFT JOIN
  (select Line_Item_ID from `myproject.mydataset.vw_3) c
  ON
    c.Line_Item_ID = a.LineItemID

Определение vw_1 следующее. Обратите внимание, что он запрашивает таблицу с разделами по датам. Это представление использовало TABLE_DATE_RANGE, когда оно было устаревшим SQL.

#standardSQL
SELECT
  *
FROM
  `myproject.mydataset.orders_daily_*`
WHERE
  _TABLE_SUFFIX >= '20170101'

Ответы:


1

Это не похоже на то, что вы опубликовали, но возможно ли, что звездное расширение myproject.mydataset.orders_daily_* также включает представление (до фильтра на _TABLE_SUFFIX)? В этом случае вам нужно будет либо дать представлениям разные имена, либо использовать более длинный префикс для таблицы подстановочных знаков, чтобы она не включала представления в свое расширение.

20.04.2017
  • Нет, похоже, это не так. Таблица orders_daily_ - это обычная таблица с разделами по датам. Все поля в этой таблице допускают значение NULL. Возможно ли, что таблица с разделением по дате является строго устаревшей таблицей? Считается ли сама таблица каким-либо значимым образом устаревшей с точки зрения движка BQ? 20.04.2017
  • Если я заменю vw_1 в подзапросе a материализованной таблицей на основе vw_1, я больше не получу сообщение об ошибке, когда оба vw_2 и vw_3 объединены. Однако я получаю сообщение об ошибке, если затем добавляю третье объединенное представление, vw_4. В этом случае vw_2, vw_3 и vw_4 все еще выбирают из vw_1. Единственное, что было материализовано, - это представление, которое было выбрано в подзапросе a. 20.04.2017
  • Если это разделение по дате, то я ожидаю увидеть фильтр на _PARTITIONTIME, а не на _TABLE_SUFFIX. Похоже, вы используете таблицу с подстановочными знаками, а не секционированную таблицу. См. cloud.google.com/bigquery/docs/partitioned-tables. 20.04.2017
  • Да, ты прав. Это таблица с подстановочными знаками, а не таблица с разделами по датам, которая является основой v1. Объединение разделов таблицы, похоже, хорошо работает во всех других запросах, которые я выполнял. На данный момент я создал отдельные версии v2, v3 и v4, которые выбирают из материализованной таблицы на основе v1 вместо представления v1. Недостатком является то, что нам нужно будет запускать задание для материализации этой таблицы каждый день. 20.04.2017
  • Если у вас есть образец идентификатора задания для одного из неудавшихся запросов, рассмотрите возможность отправки сообщения об ошибке в [средство отслеживания проблем] (issueetracker.google.com/issues?q=componentid:187149%2B), чтобы кто-нибудь мог узнать, что именно происходит. 20.04.2017
  • Спасибо, Эллиот. Я только что отправил проблему. 21.04.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..