在一些情况下,我们在数据模型中创建了一个SQL查询,SQL查询能够正常查询预览出数据,但保存时会提示SQL查询只支持抽取模式,这是为什么呢?
这是因为数据模型直连情况下,要求SQL查询中的SQL必须是可以嵌套查询的。简单来说即下面SQL语句是可以执行成功不报错的。
select * from (原始SQL) T1 WHERE 1 = 0
保存SQL查询时,我们可以从SQL监控或系统日志中找到执行报错的SQL,分析其报错原因,以上述sql为例,可能模型中sql查询运行正常,但SQL监控会显示运行状态为失败:
以上面的SQL为例,是因为SQLServer中不允许子查询中包含ORDER BY子句。
在高版本Smartbi中也会直接提示报错的SQL了。
那为什么直连一定要求SQL是可嵌套呢?
原因在于我们基于SQL查询做聚合运算时,会嵌套SQL,如果SQL不支持嵌套,就无法进行正常的聚合查询。
比如原始SQL我们从订单表中查询数据
select * from northwind.dbo.orders
现在需要从省份维度查询订单数量,就需要构造如下SQL
select ShipProvince, COUNT(1) from ( select * from northwind.dbo.orders ) t1 group by ShipProvince
如果SQL无法支持嵌套查询,我们就会先将SQL查询的数据抽到缓存库中,得到抽取表A,聚合时从A中查询。
select ShipProvince, COUNT(1) from A group by ShipProvince