我正在从 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'