繁体   English   中英

编写这些SQL语句的更好方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM