2017-04-20 9 views
2

私はlegacySQLからstandardSQLに移行しています。レガシーで動作する比較的単純なクエリでエラーが発生しています。BigQueryエラー "View X is self-referencing"

エラーは、「表示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 

1つのサブクエリ(aのエイリアス)に2つのビュー(エイリアスbとc)が残っています。

vw_2とvw_3はどちらもそれぞれ1列(Line_Item_ID)を返し、どちらもmyproject.mydataset.vw_1から選択することに注意してください。私はこの問題が、それぞれ同じビューを照会するこれらの2つのビューと関係していると考えていますが、標準ではなくレガシーで機能するのは奇妙です。

テーブルエイリアスbまたはテーブルエイリアスcへの結合をコメント化すると、クエリは機能し、a.LineItemIDを返します。 bとcの両方が結合されていると、 "view X is self-referencing"エラーのみが返されます。

私は、列名Line_Item_IDを指定するこのようなサブクエリでbとcにジョインを置き換えようとしましたが、同じエラーが発生します。

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_表は、通常の日付区画表です。すべてのフィールドは、そのテーブルでNULL可能です。日付パーティション表は厳密にレガシー互換表である可能性はありますか? BQエンジンの観点から見ると、テーブルそのものは有意義な方法でレガシーと見なされていますか? –

+0

サブクエリaのvw_1をvw_1に基づくマテリアライズド・テーブルに置き換えると、vw_2とvw_3の両方が結合されてもエラーは発生しなくなりました。しかし、3番目の結合ビューvw_4を追加するとエラーになります。この場合、vw_2、vw_3、およびvw_4はすべてまだvw_1から選択しています。現実化されたのはサブクエリaで選択されたビューだけです。 –

+0

日付分割されている場合は、 '_TABLE_SUFFIX'ではなく' _PARTITIONTIME'にフィルタが表示されます。パーティション化された表ではなくワイルドカード表を使用しているようです。 https://cloud.google.com/bigquery/docs/partitioned-tablesをご覧ください。 –