Я перехожу с 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'
_PARTITIONTIME
, а не на_TABLE_SUFFIX
. Похоже, вы используете таблицу с подстановочными знаками, а не секционированную таблицу. См. cloud.google.com/bigquery/docs/partitioned-tables. 20.04.2017