2017-04-20 43 views
2

我正在從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' 

回答

0

它不會出現從您發佈的這是什麼方式,但有可能是的myproject.mydataset.orders_daily_*星擴展包括視圖,以及(前上_TABLE_SUFFIX過濾器)?如果是這種情況,您需要爲視圖指定不同的名稱,或者爲通配符表使用更長的前綴,以使其不包含擴展視圖。

+0

不,看起來並非如此。 orders_daily_表是正常的日期分區表。所有字段在該表中都是可空的。是否有可能日期分區表嚴格爲傳統兼容表?從BQ引擎的角度來看,表格本身是否以任何有意義的方式被視爲遺產? –

+0

如果我使用基於vw_1的物化表替換子查詢a中的vw_1,則當vw_2和vw_3都加入時,我不會再收到錯誤。但是,如果我添加了第三個連接的視圖vw_4,則確實出現錯誤。在這種情況下,vw_2,vw_3和vw_4仍然從vw_1中選擇。唯一已經實現的是在子查詢a中選擇的視圖。 –

+0

如果是日期分區,那麼我希望在'_PARTITIONTIME'而不是'_TABLE_SUFFIX'上看到一個過濾器。看起來你正在使用通配表而不是分區表。請參閱https://cloud.google.com/bigquery/docs/partitioned-tables。 –