我正在从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'
答案 0 :(得分:0)
它不会以您发布的方式显示,但是myproject.mydataset.orders_daily_*
的星形扩展是否也可能包含视图(在_TABLE_SUFFIX
上的过滤器之前)?如果是这种情况,您将需要为视图提供不同的名称,或者为通配符表使用更长的前缀,以便它不会在其扩展中包含视图。