如何将以下算法编码为SQL查询(a
和b
和c
是我数据库中的表格)
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中的一个字段中。我说我根据员工性别计算出不同的结果。现在又有数百家公司,每家公司都有数千名员工。
答案 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;