问题描述
如下图,两个简单的子查询,拼接后出现schema T708不存在的错误
软件:smartbi v7;华为高斯数据库主备版
问题分析
下述语句在navicat中执行正常,但在smartbi中却报错
SELECT a.ds ,a.esnq,b.esdb //没有给字段别名
FROM
(
SELECT ds,count(*) AS esnq
FROM lsksmlydb
WHERE dbsj<'2023-01-01'
GROUP BY ds
ORDER BY ds
) a
LEFT JOIN
(
SELECT ds,count(*) AS esdb
FROM lsksmlydb
WHERE dbsj>='2024-01-01'
GROUP BY ds
ORDER BY ds
) b
on a.ds=b.ds
ORDER BY a.ds
观察报错截图,smartbi主动给我原始的sql语句的外面多套了一层:
select T708.a.ds as F723,T708. a.esng as F724,T708.b.esdb as F725 from (..........) T708
因此问题在于外面加的这层东西身上。
经过别人的提醒,当前版本高斯数据库是不支持大写的,除了select 、from、left join等查询关键字。
所以很可能是smartbi自作主张给原始sql套了一层大写的别名后导致高斯数据库识别不了。
又已知,以前的多层嵌套的sql能正常在smartbi执行,对比了一下发现能执行的在原sql最外层都给字段加了小写别名。
此时可以确定,smartbi 在遇到有子查询的sql语句时,如果发现最外层的字段没有给别名,则会自动在外头再加一层,然后给各个字段加别名;如果最外层已经有别名,则不会再加别名。
问题定位
1.高斯数据库不支持大写的字段名、表名;
2.smarbi遇到嵌套子查询的sql语句时,若原始语句最外层没有添加字段别名,则在原始语句上再包一层,然后给一个新的表名和字段别名,且均为大写。
这将导致查数据库是,高斯数据库不能识别这些别名,导致语句报错。
问题解决
在遇到有子查询嵌套的sql语句时,应该在最外层的字段那里加上别名,从而避免smartbi自动给sql语句补全别名。入上述语句可改为:
SELECT a.ds as ds,a.esnq as esnq,b.esdb as esdb //这里给字段加别名,其他不变
FROM
(
SELECT ds,count(*) AS esnq
FROM lsksmlydb
WHERE dbsj<'2023-01-01'
GROUP BY ds
ORDER BY ds
) a
LEFT JOIN
(
SELECT ds,count(*) AS esdb
FROM lsksmlydb
WHERE dbsj>='2024-01-01'
GROUP BY ds
ORDER BY ds
) b
on a.ds=b.ds
ORDER BY a.ds