修改底表

功能介绍

当系统生成一个 SQL 时,对于 FROM 从句,有三种选择方式。本文档将详细介绍这三种方式及其使用场景。

三种 FROM 从句方式

方式一:从 Schema 的 ID 字段获取(默认)

这是最简单的方式,系统会直接使用 Schema 的 ID 作为 FROM 的表名。

示例:如果 Schema 的 ID 为 dwd_sales,那么最后生成的 SQL 的 FROM 部分为:

FROM dwd_sales

这种方式适合大多数常规场景,无需额外配置。

方式二:固定 SQL

如果你需要换一张表或者换一个数据库,可以使用固定 SQL 方式。

配置路径:编辑 Schema -> 高级配置 -> From哪张表 -> 固定SQL

示例:在固定 SQL 里面填入 ads.sales,那么最后生成的 SQL 的 FROM 部分为:

FROM ads.sales

子查询/视图场景:如果需要使用子查询(虚拟视图),必须用括号将整个 SELECT 语句包裹起来。

示例:在固定 SQL 里面填入:

(SELECT entity_id AS id, entity_name AS name FROM table_name GROUP BY entity_id, entity_name)

那么最后生成的 SQL 的 FROM 部分为:

FROM (SELECT entity_id AS id, entity_name AS name FROM table_name GROUP BY entity_id, entity_name)
Warning

使用子查询时,请确保最外层使用括号 () 包裹,否则生成的 SQL 会出现语法错误。

这种方式适合以下场景:

  • 需要指定完整的数据库和表名(如 database.table
  • 需要使用与 Schema ID 不同的表名
  • 需要使用子查询进行数据预处理(如聚合、字段重命名等)

方式三:不同提问不同 SQL(fromSQL 函数)

Tip

此方式的使用需要有 SQL 和 JavaScript 基础。

对于需要根据提问时的筛选条件不同而决定不同 SQL 的场景,可以使用 fromSQL 函数。

配置路径:编辑 Schema -> 高级配置 -> From哪张表 -> 不同提问不同SQL

示例场景

  • 根据用户选择的地区不同,从不同的表中查询数据
  • 根据时间范围不同,从历史表或实时表中查询

fromSQL 函数

函数签名

(logicform, helperFunctions) => {
  // 根据 logicform 动态返回表名
  return 'database.table_name';
}

参数说明

参数类型说明
logicformLogicformType代表用户的提问意图,包含筛选条件、维度等信息
helperFunctionsany各种帮助函数的集合

helperFunctions 可用函数

helperFunctions 中包含以下帮助函数:

函数说明示例
log将信息打印到提问后的调试模块中,方便调试helperFunctions.log('当前选择的地区:华东')
momentmomentjs 库,用于日期处理helperFunctions.moment()
_underscore 库,提供实用的工具函数helperFunctions._.map()

返回值要求

fromSQL 函数需要返回一个字符串,表示要使用的表名或完整的 FROM 语句。

返回值示例

  • 'dwd_sales' - 简单表名
  • 'ads.sales' - 带数据库的表名
  • '(SELECT xxx FROM xxx GROUP BY xxx)' - 子查询

使用示例

(logicform, helperFunctions) => {
  const {log} = helperFunctions;

  // 获取用户选择的地区维度
  const region = logicform.dimensions?.地区;

  if (region === '华东') {
    log('使用华东数据表');
    return 'dwd_sales_east';
  } else if (region === '华北') {
    log('使用华北数据表');
    return 'dwd_sales_north';
  } else {
    log('使用默认销售表');
    return 'dwd_sales';
  }
}

配置入口

三种方式的配置都在同一个位置:

编辑 Schema -> 高级配置 -> From哪张表

配置项对应方式
不配置(留空)方式一:从 Schema ID 获取
固定SQL方式二:使用固定表名
不同提问不同SQL方式三:使用 fromSQL 函数