将分区筛选器从外部查询传递到内部查询



我有一个查询,它连接来自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'

最新更新