【问题标题】:How to achieve an indirect join in Cube.js?如何在 Cube.js 中实现间接连接?
【发布时间】:2020-08-14 02:49:29
【问题描述】:

我可能会误解 cube.js 连接,但在 SQL 中,我可以从被这样删除的表中进行连接:

SELECT * FROM a
LEFT JOIN b ON a.name = b.name
LEFT JOIN c ON b.state = c.state;

我的问题是:我如何在cube.js 中实现这一点?

我尝试使用以下架构(以及它的一些变体)重新创建上面的内容:

cube(`A`, {
  sql: `SELECT * FROM a`,

  joins: {
    B: {
      sql: `${A}.name = ${B}.name`,
      relationship: `belongsTo`,
    },
    C: {
      sql: `${B}.state = ${C}.state`,
      relationship: `belongsTo`,
    },
  },

  dimensions: {
    id: {
      sql: `id`,
      type: `number`,
      primaryKey: true,
    },

    name: {
      sql: `${B}.name`,
      type: `string`,
    },

    state: {
      sql: `${C}.state`,
      type: `string`,
    },
  },
});

其中还定义了多维数据集 BC,包括此处使用的维度。

但是,制定以下查询:

dimensions: [`A.state`];

抛出错误:

Error: ER_BAD_FIELD_ERROR: Unknown column 'b.state' in 'on clause'

我可能会错过显而易见的事情,如果有任何指点,我将不胜感激......

【问题讨论】:

    标签: mysql cube.js


    【解决方案1】:

    原来BC加入:

      joins: {
    
        //...
    
        C: {
          sql: `${B}.state = ${C}.state`,
          relationship: `belongsTo`,
        },
      },
    

    需要发生在立方体 B 而不是立方体 A。原因似乎是多维数据集引用其他多维数据集,而不是在引擎盖下构建持久表。

    这也解释了为什么源自连接表的维度仍需要指向代表连接表的多维数据集 - 例如上面问题代码中的 state 维度:

    state: {
      sql: `${C}.state`,
      type: `string`,
    },
    

    【讨论】:

      猜你喜欢
      • 2021-05-01
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 2017-07-26
      • 2020-05-22
      • 2018-12-27
      相关资源
      最近更新 更多