我有一个名称及其频率的表格(表1)
Name-----Frequency
Mike-------0.56
Fred-------0.30
Nancy------0.14
和笛卡尔积(table2),其中名称在两列和第三列中配对,我想通过将前两列中的名称与table1相匹配来对table1中的频率求和。
Name1-------Name2------sum
Mike--------Fred
Mike--------Nancy
Fred--------Nancy
我想使用表1中的频率更新table2的sum列,并在更新中使用子查询来匹配名称(或者这是我想象的,我需要这样做)。如果有更好的方法,请告诉我。
我有:
UPDATE table2
SET sum = (SELECT dbo.table1.Frequency WHERE Name1 = dbo.table1.Name) +
(SELECT dbo.table1.Frequency WHERE Name2 = dbo.table1.Name)
FROM table1
我得到一个充满NULL而不是频率总和的表。 我是以正确的方式来做这件事的吗?我完全不知道如何做到这一点并且有更好的方法吗?
答案 0 :(得分:2)
尝试从这样的连接进行更新:
int r, c;
float sum;
for (c=0; c<cols; c++) {
sum=0;
for (r=0; r<rows; r++) {
sum += dat.at<float>(r,c);
}
std::cout << "sum=" << ss << " avg=" << ss/r << std::endl;
}
答案 1 :(得分:2)
你的方法很好。如果所有名称都匹配:
UPDATE t2
SET sum = (SELECT f.frequency FROM dbo.table1.Frequency f WHERE t2.Name1 = f.Name) +
(SELECT f.frequency FROM dbo.table1.Frequency f WHERE t2.Name2 = f.Name)
FROM table2 t2;
如果他们不这样做,那么请使用isnull()
(或coalesce()
,但isnull()
效率更高):
UPDATE t2
SET sum = isnull( (SELECT f.frequency FROM dbo.table1.Frequency f WHERE t2.Name1 = f.Name), 0) +
isnull( (SELECT f.frequency FROM dbo.table1.Frequency f WHERE t2.Name2 = f.Name), 0)
FROM table2 t2;