Google bigquery “BigQuery错误”;视图X是自参考的“;

Google bigquery “BigQuery错误”;视图X是自参考的“;,google-bigquery,bigquery-standard-sql,Google Bigquery,Bigquery Standard Sql,我正在从legacySQL迁移到standardSQL,我在一个相对简单的查询上遇到了一个错误,这个查询在legacy中工作 错误为“查看myproject.mydataset.vw_1为自引用” 有两个视图(别名为b和c)左键连接到一个子查询(别名为a) 请注意,vw_2和vw_3都返回1列(行_项_ID),并且都从“myproject.mydataset.vw_1”中进行选择。我怀疑这个问题与这两个视图有关,每个视图都查询同一个视图,但奇怪的是,它将在遗留而非标准中工作 如果注释掉表别名b或

我正在从legacySQL迁移到standardSQL,我在一个相对简单的查询上遇到了一个错误,这个查询在legacy中工作

错误为“查看myproject.mydataset.vw_1为自引用”

有两个视图(别名为b和c)左键连接到一个子查询(别名为a)

请注意,vw_2和vw_3都返回1列(行_项_ID),并且都从“myproject.mydataset.vw_1”中进行选择。我怀疑这个问题与这两个视图有关,每个视图都查询同一个视图,但奇怪的是,它将在遗留而非标准中工作

如果注释掉表别名b或表别名c的联接,则查询将工作并返回a.LineItemID。当b和c都连接时,它仅给出“视图X为自参考”错误

我尝试过用这样的子查询替换b和c的连接,这些子查询指定了列名Line\u Item\u 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时使用了表\日期\范围

#standardSQL
SELECT
  *
FROM
  `myproject.mydataset.orders_daily_*`
WHERE
  _TABLE_SUFFIX >= '20170101'

从您发布的内容来看,它不是这样显示的,但是
myproject.mydataset.orders\u daily.*
的星形扩展是否也包括该视图(在
\u TABLE\u SUFFIX上的过滤器之前)?如果是这种情况,则需要为视图指定不同的名称,或者为通配符表使用更长的前缀,这样它就不会在扩展中包含视图。

不,情况似乎并非如此。orders_daily_表是一个普通的日期分区表。该表中的所有字段都可以为空。日期分区表是否可能是严格兼容旧版的表?从BQ引擎的角度来看,表本身是否以任何有意义的方式被认为是遗留的?如果我用基于vw_1的物化表替换子查询a中的vw_1,当vw_2和vw_3都被连接时,我将不再收到错误。但是,如果我随后添加第三个连接视图vw_4,则会出现错误。在这种情况下,vw_2、vw_3和vw_4仍在选择vw_1。唯一具体化的是在子查询a中选择的视图。如果它是日期分区的,那么我希望在
\u PARTITIONTIME
上看到一个过滤器,而不是
\u TABLE\u SUFFIX
。看起来您使用的是通配符表,而不是分区表。看,是的,你是对的。它是一个通配符表,而不是作为v1基础的日期分区表。在我运行的所有其他查询中,表分区的并集似乎工作得很好。目前,我已经创建了v2、v3和v4的不同版本,它们基于v1而不是视图v1从物化表中进行选择。缺点是,我们需要每天运行一个作业来实现该表。如果您有一个失败的查询的示例作业ID,请考虑在[问题跟踪器]上提交一个bug(SeaSeTrask.com,谷歌/CopysQ=组件187149%:2B),以便有人可以查看正在发生的事情。
#standardSQL
SELECT
  *
FROM
  `myproject.mydataset.orders_daily_*`
WHERE
  _TABLE_SUFFIX >= '20170101'