我有一个查询,它连接来自3个表table1 INNER JOIN table2 LEFT JOIN table3
的数据。在查询过程中,所有3个表都必须应用分区筛选器。当前筛选器设置为CCD_ 2。我想将内部查询保存为视图,这样我的最终用户就可以提供分区日期,并且内部查询只读取用户请求数据的分区。有没有办法将分区日期传递给视图定义?例如:我希望2021-12-31被传递给WITH子句上的WHERE条件,而不是WHERE _PARTITIONDATE IS NOT NULL
SELECT * FROM (
WITH T1 AS (
SELECT column1, column2, _PARTITIONDATE
FROM `projectid.datasetid.table1`
WHERE _PARTITIONDATE IS NOT NULL
)
,T2 AS (
SELECT column3, column4, _PARTITIONDATE
FROM `projectid.datasetid.table2`
WHERE _PARTITIONDATE IS NOT NULL
)
,T3 AS (
SELECT column5, column6,_PARTITIONDATE
FROM `projectid.datasetid.table3`
WHERE _PARTITIONDATE IS NOT NULL
)
SELECT
T1.column1,
T1.column2,
T2.column3,
T2.column4,
T3.column5,
T3.column6,
T1._PARTITIONDATE AS PARTITIONDATE
FROM T1 INNER JOIN T2
ON T1.column1 = T2.column3
T1._PARTITIONDATE = T2._PARTITIONDATE
LEFT OUTER JOIN T3
ON T3.column5 = T2.column3 AND
T3._PARTITIONDATE = T2._PARTITIONDATE
) WHERE PARTITIONDATE = '2021-12-31';
它被称为push谓词,在oracle中它是一个提示/*+push_pred*/在大查询中它是自动完成的,所以你只需要创建不带过滤器的视图。请参阅文章
标准SQL的优点标准SQL符合SQL 2011标准,并具有支持查询嵌套和重复数据的扩展。与传统SQL相比,它有几个优点,包括:
- 使用WITH子句和SQL函数的可组合性
- SELECT列表和WHERE子句中的子查询相关子查询
- ARRAY和STRUCT数据类型插入、更新和删除
- COUNT(DISTINCT(精确且可扩展,提供准确度
- 不受其限制的EXACT_COUNT_DISTINCT的自动谓词
- 下推通过JOIN复杂的JOIN谓词,包括任意表达式
此外,您可以尝试参数化查询:
bq query
--use_legacy_sql=false
--parameter=corpus::romeoandjuliet
--parameter=min_word_count:INT64:250
'SELECT
word, word_count
FROM
`bigquery-public-data.samples.shakespeare`
WHERE
corpus = @corpus
AND
word_count >= @min_word_count
ORDER BY
word_count DESC'