![](/img/trans.png)
[英]I have to write two SQL statements in order to update a record, is there a better way to do it?
[英]Better way to write these SQL statements
我想读取数据以进行报告。 目前,我使用另一个表的计算数据填充表,并从填充的表中读取数据以进行报告。 我当前的逻辑是在事务内全部删除旧数据,然后插入新数据。
更新
要求
1)下面的逻辑是每秒运行一次。 请注意,其他进程也以相同的刷新速率对tableB进行udp。
2)TableB用于报告目的。 TableA和TableB驻留在不同的数据库中。
3)TableB包含大约1000万行,大约400万行将通过下面的代码每秒更新一次。 其他进程也以相同的刷新率更新tableB中的另一部分数据(6 = 10-4百万)。
我担心的是:
1)三个语句使用相似的sum和where子句,可能需要改进。
2)tablea中大约有1-2百万行要更新为tableB。 使用显式临时表可能会减慢速度。
3)使用事务可能会减慢速度,但这似乎是唯一的方法。
4)更新数据可能比删除和插入更好(我应该选择哪个?)
我想找到一种更好的表现方式(包括表重新设计等)。 下面是当前的方式:
伪代码如下:
start/begin transaction here
DELETE from tableb data that I want to insert below, e.g. delete data where Code = 'code'
INSERT INTO tableb(Code, Total)
SELECT sum(a.Code, price)
FROM tablea a
GROUP BY a.Code;
IINSERT INTO tableb(Code, Total)
SELECT sum(a.Code price) -- use price
FROM tablea a
WHERE a.meanPrice IS NOT NULL
GROUP BY a.Code;
INSERT INTO tableb(Code, Total)
SELECT sum(a.Code, meanPrice ) -- use meanPrice
FROM tablea a
WHERE a.meanPrice IS NOT NULL
GROUP BY a.Code;
Commit transaction here
它用于MySQL,但理想情况下应该是通用的。
任何想法?
您实际上是否需要更新表中的值? 它们没有标记任何ID或名称来标识它们。
以下SELECT语句返回所需的数据:
SELECT code,
sum(price),
sum(case when a.meanPrice is not null then price else 0 end),
sum(case when a.meanPrice is not null then meanprice else 0 end)
FROM tablea a
GROUP BY a.Code;
如果需要将其插入到临时表中,则可以取消数据透视。 但是,这种格式对我来说没有意义。 您能解释一下为什么您使用这种具有一个数字列的表吗?
第三点是错误的。
解决方案1:创建一个存储过程。
解决方案2:在受影响的表上创建触发器。
解决方案3:每次都不要求和,第一次求和,然后将数字保存在另一个表中。 在对该表进行的每次修改中,对新表进行求和,我将不会是一百万条记录,每个表只有一个。
数据透视表!
此查询仅一步一步即可完成您的INSERT
任务,但是...孩子们,不要在不实际测量实际性能的情况下在家进行此操作:
http://sqlfiddle.com/#!2/381e2/9
INSERT INTO tableb(Total)
SELECT
CASE
WHEN t.v = 1
THEN SUM( price )
WHEN t.v = 2
THEN SUM(
CASE
WHEN meanPrice IS NOT NULL THEN price
ELSE 0
END
)
WHEN t.v = 3
THEN SUM( meanPrice )
END AS Total
FROM tablea
INNER JOIN
( SELECT 1 AS v UNION ALL
SELECT 2 AS v UNION ALL
SELECT 3 AS v
) AS t
GROUP BY tablea.Code, t.v;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.