如何有效地将循环编写为SQL查询

时间:2014-03-12 20:33:23

标签: sql

如何将以下算法编码为SQL查询(abc是我数据库中的表格)

for all a:
case c.column=0
set a.columnname+=b.column1*b.column2
case c.column=1
...

earlier i solved a similar problem by:                          
UPDATE a 
set
a.column= (select SUM(column1) from b where a.column2=b.column2)   

但是因为在总结两列产品时,我不认为我可以做同样的事情。 真正的问题还在于与c的一对一关系。

关系:

一对多b。

b一对一c

假设A是公司数据表,B是员工数据表,C告诉我们员工是男性还是女性(只是一个例子不是我的问题)。现在我需要计算每个公司给每个员工的总薪水,并将其存储在公司table.lets中的一个字段中。我说我根据员工性别计算出不同的结果。现在又有数百家公司,每家公司都有数千名员工。

3 个答案:

答案 0 :(得分:1)

您可能希望将其分解为一系列查询" case"从case语句作为不同的WHERE子句:

UPDATE <thing>
SET .......
FROM a,b c
INNER JOIN .......
WHERE c.column=0;


UPDATE <thing>
SET .......
FROM a,b c
INNER JOIN .......
WHERE c.column=1;

有关语法类型的示例,请参阅以下内容:

答案 1 :(得分:1)

如果您在每种情况下都更新columnname,那么您不需要循环:

UPDATE a
SET columnname = 
   CASE WHEN c.column=0
      THEN columnname + b.column1*b.column2
   CASE WHEN c.column=1
      THEN ...

否则它会更清晰,因为具有不同WHERE子句的多个UPDATE

根据您的更新和评论,此类内容可能有效:

UPDATE a 
set a.column = 
(SELECT 
 SUM(
     CASE WHEN c.EmployeeGender = 0
            THEN b.column1*b.column2
          WHEN c.EmployeeGender = 1
            THEN ... 
          ELSE 
     END
     )
 FROM b 
 INNER JOIN c
    ON b.EmployeeID = c.EmployeeID
 WHERE a.column2=b.column2) 

答案 2 :(得分:0)

要减少设置,请使用GROUP BY和聚合函数,例如SUM。 对于A中的每条记录,您希望获得B和C中所有相关记录的某些函数的总和。

首先,我们将制作一个SELECT语句,以确保我们获得正确的数据。这看起来像是:

SELECT 
  a.id,
  SUM(CASE WHEN c.[column]=0 THEN b.column1 * b.column2 ELSE 0 END) +
    SUM(CASE WHEN c.[column]=1 THEN b.column1 + b.column2 ELSE 0 END) AS new_value
FROM a
INNER JOIN b ON a.id = b.a_id
INNER JOIN c ON b.id = c.b_id
GROUP BY a.id --and all other columns from A that you select/update, making sure it contains at least the columns required to select a unique record from a.

要将此转换为更新语句,您可以以1:1的方式连接到常规表A:

UPDATE updated_a
  SET columnname = new_value
  FROM a AS updated_a INNER JOIN
   (SELECT 
  a.id,
  SUM(CASE WHEN c.[column]=0 THEN b.column1 * b.column2 ELSE 0 END) +
    SUM(CASE WHEN c.[column]=1 THEN b.column1 + b.column2 ELSE 0 END) AS new_value
FROM a
INNER JOIN b ON a.id = b.a_id
INNER JOIN c ON b.id = c.b_id
GROUP BY a.id) AS calculation ON updated_a.id = calculation.id;

http://sqlfiddle.com/#!6/2dffa/14