Cube.js - 无法连接 2 个或更多表,但不断收到 "Can't find join path to join" 错误

Cube.js - Unable to join 2 or more tables but keep getting a "Can't find join path to join" error

我是 Cube.js 的新手,我正在尝试使用连接从 2 个或更多表中获取数据。

原始的 SQL 查询看起来像这样,它将多个表连接在一起以显示所有 3 个表的数据。

SELECT wo.EndDate AS DueDate, p.PurchaseNumber AS Details, [proc].Name
FROM WorkOrder wo
INNER JOIN Purchase p
ON wo.PurchaseId = p.Id
INNER JOIN Product pr
ON wo.ProductId = pr.Id
INNER JOIN [Procedure] [proc]
ON pr.ProcedureId = [proc].Id

这是我的 Cube.js 架构

cube(`WorkOrder`, {
    sql: `SELECT * FROM dbo."WorkOrder"`,

    joins: {
        Purchase: {
            relationship: `hasMany`,
            sql: `${WorkOrder}.PurchaseId = ${Purchase}.Id`
        },
        Product: {
            relationship:`hasMany`,
            sql: `${WorkOrder}.ProductId = ${Product.Id}`
        },
        Procedure: {
            relationship: `hasMany`,
            sql: `${Product}.ProcedureId = ${Procedure}.Id`
        }
    },

    dimensions: {
            id: {
                sql: `${CUBE}."Id"`,
                type: `number`,
                primaryKey: true,
                shown: true
            },

            scheduledstartdate: {
                sql: `${CUBE}."ScheduledStartDate"`,
                type: `time`
            },

            scheduledenddate: {
                sql: `${CUBE}."ScheduledEndDate"`,
                type: `time`
            }
    }
});

cube(`Purchase`, {
    sql: `SELECT * FROM dbo."Purchase"`,

    dimensions: {
        id: {
            sql: `${CUBE}."Id"`,
            type: `number`,
            primaryKey: true
        },

        customerpurchasenumber: {
            sql: `${CUBE}."CustomerPurchaseNumber"`,
            type: `string`
        }
    }
});

cube(`Product`, {
    sql: `SELECT * FROM dbo."Product"`,

    dimensions: {
        id: {
            sql: `${CUBE}."Id"`,
            type: `number`,
            primaryKey: true
        },

        name: {
            sql: `${CUBE}."Name"`,
            type: `string`
        }
    }
});

cube(`Procedure`, {
    sql: `SELECT * FROM dbo."Procedure"`,

    dimensions: {
        id: {
            sql: `${CUBE}."Id"`,
            type: `number`,
            primaryKey: true
        },

        name: {
            sql: `${CUBE}."Name"`,
            type: `string`
        },
    }
});

然后我会尝试在 Cube.js API 中使用此

进行查询
'{"dimensions":["WorkOrder.scheduledenddate", "Purchase.customerpurchasenumber", "Procedure.Name"]}'

但我会不断收到“找不到加入 'WorkOrder'、'Purchase'”的错误。我试图让它更容易,只查询 2 个表,但仍然是同样的错误。有人可以指出我缺少什么才能让它工作吗?

注意:现在有一个more complete and correct answer in the official documentation

当 cube.js 找不到为查询中传递的多维数据集构建连接的方法时,会出现“找不到连接路径...”错误。

要修复错误,您需要描述 joins parameter

根据您描述的关系,cube.js构建一个有向图,其中节点是立方体,边是您描述的关系。

由于 cube.js 在连接多维数据集时使用左连接,因此查询中多维数据集的顺序很重要。

在您的情况下,图表如下所示:

所以,您的查询是正确的

{"dimensions":["WorkOrder.scheduledenddate", "Purchase.customerpurchasenumber", "Procedure.Name"]}

但是,例如,这个查询是错误的

{"dimensions":["Procedure.name","Purchase.customerpurchasenumber"]}

由于该图没有从“程序”传出并导致“购买”的边

要修复错误,请将 joins 参数添加到“过程”多维数据集的描述中,它描述了“过程”和“采购”之间的关系