使用公式的SQL Server Update子查询不太正确

时间:2018-05-03 19:15:56

标签: sql sql-server tsql

我有一个名称及其频率的表格(表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而不是频率总和的表。 我是以正确的方式来做这件事的吗?我完全不知道如何做到这一点并且有更好的方法吗?

2 个答案:

答案 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;