Как добиться косвенного объединения в Cube. js? - PullRequest
1 голос
/ 29 апреля 2020

Я могу неправильно понять 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`,
    },
  },
});

, где также определены кубы B и C, включая размеры используется здесь.

Однако, формулируя следующий запрос:

dimensions: [`A.state`];

выдает ошибку:

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

Я мог бы упустить очевидное, и был бы благодарен за любые указатели ...

1 Ответ

1 голос
/ 02 мая 2020

Оказывается, что следующее соединение от B до C:

  joins: {

    //...

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

должно происходить внутри куба B, а не куба A. Кажется, причина в том, что кубы ссылаются на других кубов, а не создают постоянные таблицы под колпаком.

Это также объясняет, почему измерения, которые происходят из соединенных таблиц, все еще должны указывать на кубы, представляющие объединенную таблицу - как, например, измерение state в коде вопроса выше:

state: {
  sql: `${C}.state`,
  type: `string`,
},
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...