【发布时间】:2015-03-20 10:18:19
【问题描述】:
假设我有以下两个数据集:
var revenueTestData = [
{"YEAR": "2007", "MONTH": "1", "CUSTOMER": "Customer1", "REVENUE": "1938.49488391425"},
{"YEAR": "2007", "MONTH": "1", "CUSTOMER": "Customer2", "REVENUE": "75.9142774343491"},
{"YEAR": "2007", "MONTH": "2", "CUSTOMER": "Customer2", "REVENUE": "99.3456067931875"}];
和
var costTestData = [
{"YEAR": "2009", "MONTH": "1", "CUSTOMER": "Customer4", "COST": "14425"},
{"YEAR": "2009", "MONTH": "1", "CUSTOMER": "Customer4", "COST": "7591"},
{"YEAR": "2009", "MONTH": "2", "CUSTOMER": "Customer5", "COST": "31875"}];
我如何(用 sql 术语)完全外部连接两个数据集?更重要的是,我可以根据多列/主键来做吗?例如,在这种情况下,按 YEAR 和 CUSTOMER 连接并获取 YEAR、CUSTOMER、REVENUE 的所有值,即使年份不匹配(在这种情况下,缺失的列将为空)。
我遇到了以下编写精美的函数,我可以使用它进行 LEFT JOIN 并决定将哪些列包含在我的结果集中,但是当年份不匹配时,它们会从结果集中退出(如预计在内连接中):
function innerjoinData(primary, foreign, primaryKey, foreignKey, select) {
var m = primary.length, n = foreign.length, index = [], c = [];
for (var i = 0; i < m; i++) { // loop through m items
var row = primary[i];
index[row[primaryKey]] = row; // create an index for primary table
}
for (var j = 0; j < n; j++) { // loop through n items
var y = foreign[j];
var x = index[y[foreignKey]]; // get corresponding row from primary
c.push(select(x, y)); // select only the columns you need
}
return c;
}
一个示例调用如下所示:
var testChartData= innerjoinData(revenueTestData, costTestData, "YEAR", "YEAR", function (a, b) {
return {
Year: b.YEAR,
Cost: a.COST,
Revenue: b.REVENUE
};
});
也许有人可以帮我把它变成外部连接?
【问题讨论】:
-
该调用从
select回调中引发错误。 “未捕获的类型错误:无法读取未定义的属性‘成本’”。你可以先解决这个问题 -
SQL 会不会像
SELECT year, cost, revenue FROM revenueTestData FULL OUTER JOIN costTestData ON revenueTestData.year = costTestData.year? -
那将只使用年份作为主键加入。最好还有一个
AND revenueTestData.customer = costTestData.customer,用于多个主键连接。 -
该功能只支持一键加入
-
我知道。我想做一个外连接,如果可能,但不一定,使用多个键。
标签: javascript join outer-join