legacySQL から standardSQL に移行していますが、レガシーで機能していた比較的単純なクエリでエラーが発生します。
エラーは「View myproject.mydataset.vw_1 is self-referencing」です。
#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 の両方が結合されている場合にのみ、「ビュー 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'