2

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'
4

1 に答える 1

0

あなたが投稿したものからはこのようには見えませんが、 のスター拡張にmyproject.mydataset.orders_daily_*ビューも含まれている可能性はありますか (フィルターの前に_TABLE_SUFFIX)? その場合は、ビューに別の名前を付けるか、展開にビューが含まれないようにワイルドカード テーブルに長いプレフィックスを使用する必要があります。

于 2017-04-20T03:56:38.347 に答える