私は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'
いいえ、そうは思われません。 orders_daily_表は、通常の日付区画表です。すべてのフィールドは、そのテーブルでNULL可能です。日付パーティション表は厳密にレガシー互換表である可能性はありますか? BQエンジンの観点から見ると、テーブルそのものは有意義な方法でレガシーと見なされていますか? –
サブクエリaのvw_1をvw_1に基づくマテリアライズド・テーブルに置き換えると、vw_2とvw_3の両方が結合されてもエラーは発生しなくなりました。しかし、3番目の結合ビューvw_4を追加するとエラーになります。この場合、vw_2、vw_3、およびvw_4はすべてまだvw_1から選択しています。現実化されたのはサブクエリaで選択されたビューだけです。 –
日付分割されている場合は、 '_TABLE_SUFFIX'ではなく' _PARTITIONTIME'にフィルタが表示されます。パーティション化された表ではなくワイルドカード表を使用しているようです。 https://cloud.google.com/bigquery/docs/partitioned-tablesをご覧ください。 –