Cube.js如何实现间接连接?
How to achieve an indirect join in Cube.js?
我可能会误解 cube.js
联接,但在 SQL 中,我可以从一个被删除的 table 中进行联接,如下所示:
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`,
},
},
});
其中还定义了多维数据集 B
和 C
,包括此处使用的维度。
但是,制定以下查询:
dimensions: [`A.state`];
抛出错误:
Error: ER_BAD_FIELD_ERROR: Unknown column 'b.state' in 'on clause'
我可能会错过明显的地方,如果有任何指点,我将不胜感激...
原来下面B
到C
加入:
joins: {
//...
C: {
sql: `${B}.state = ${C}.state`,
relationship: `belongsTo`,
},
},
需要在多维数据集 B
内发生,而不是在多维数据集 A
内发生。原因似乎是多维数据集 引用 其他多维数据集,而不是在幕后构建持久性 table。
这也解释了为什么源自连接的 table 的维度仍然需要指向代表连接的 table 的多维数据集 - 例如问题代码中的 state
维度以上:
state: {
sql: `${C}.state`,
type: `string`,
},
我可能会误解 cube.js
联接,但在 SQL 中,我可以从一个被删除的 table 中进行联接,如下所示:
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`,
},
},
});
其中还定义了多维数据集 B
和 C
,包括此处使用的维度。
但是,制定以下查询:
dimensions: [`A.state`];
抛出错误:
Error: ER_BAD_FIELD_ERROR: Unknown column 'b.state' in 'on clause'
我可能会错过明显的地方,如果有任何指点,我将不胜感激...
原来下面B
到C
加入:
joins: {
//...
C: {
sql: `${B}.state = ${C}.state`,
relationship: `belongsTo`,
},
},
需要在多维数据集 B
内发生,而不是在多维数据集 A
内发生。原因似乎是多维数据集 引用 其他多维数据集,而不是在幕后构建持久性 table。
这也解释了为什么源自连接的 table 的维度仍然需要指向代表连接的 table 的多维数据集 - 例如问题代码中的 state
维度以上:
state: {
sql: `${C}.state`,
type: `string`,
},