我正在從legacySQL遷移到standardSQL,並且在傳統的相對簡單的查詢中出現錯誤。BigQuery錯誤「查看X是自引用的」
錯誤是「查看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。當b和c都加入時,它只會給出「視圖X是自引用」錯誤。
我已經嘗試用這樣的子查詢替換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的定義如下。請注意,它查詢日期分區表。該視圖是傳統SQL時使用TABLE_DATE_RANGE。
#standardSQL
SELECT
*
FROM
`myproject.mydataset.orders_daily_*`
WHERE
_TABLE_SUFFIX >= '20170101'
不,看起來並非如此。 orders_daily_表是正常的日期分區表。所有字段在該表中都是可空的。是否有可能日期分區表嚴格爲傳統兼容表?從BQ引擎的角度來看,表格本身是否以任何有意義的方式被視爲遺產? –
如果我使用基於vw_1的物化表替換子查詢a中的vw_1,則當vw_2和vw_3都加入時,我不會再收到錯誤。但是,如果我添加了第三個連接的視圖vw_4,則確實出現錯誤。在這種情況下,vw_2,vw_3和vw_4仍然從vw_1中選擇。唯一已經實現的是在子查詢a中選擇的視圖。 –
如果是日期分區,那麼我希望在'_PARTITIONTIME'而不是'_TABLE_SUFFIX'上看到一個過濾器。看起來你正在使用通配表而不是分區表。請參閱https://cloud.google.com/bigquery/docs/partitioned-tables。 –