2

我正在从 legacySQL 迁移到 standardSQL,并且在旧版中工作的相对简单的查询中遇到错误。

错误是“查看 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

有 2 个视图(别名 b 和 c)左连接到 1 个子查询(别名为 a)。

请注意,vw_2 和 vw_3 都返回 1 列(Line_Item_ID),它们都从 `myproject.mydataset.vw_1 中选择。我怀疑这个问题与这两个视图有关,每个视图都查询相同的视图,但奇怪的是它可以在遗留而不是标准中工作。

如果我注释掉与表别名 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 回答