【问题标题】:Insert new data into table always after last entry in SQL总是在 SQL 中的最后一个条目之后将新数据插入表中
【发布时间】:2019-09-25 15:08:45
【问题描述】:

我有几个表,其中包含 time unix 和 time mez 列用于标识。这些将不断填充新数据(准确地说是每 60 秒)。 我创建了一个表,我们从这些表的数据中将其称为 new_table。现在我想更新这个 new_table。但仅限于比 new_table 的最后一个条目更新的其他表的数据。

所以我不必覆盖new_table 或再次收集从第 1 行开始的所有数据,因为它应该运行多年。

我尝试了一些 INSERT 或 UPDATE,但我不知道如何定义应更新数据的 SELECT 和 WHERE 条件。我对SQL非常缺乏经验。提前致谢!

请参阅以下代码了解我是如何创建 new_table 的:

USE database; /* select database */

CREATE TABLE new_table
AS
    SELECT
        table1_1min.time_unix, table1_1min.time_mez,
        /* add power consumption in kW rounded to two decimal places */
        ROUND(table1.P + table2.P + table3.P, 2) AS total
    FROM 
        table1_1min, table2_1min, table3_1min
    /* make sure same time stamp is used in every row*/
    WHERE
        table1_1min.time_unix = table2_1min.time_unix 
        AND table1_1min.time_unix = table3_1min.time_unix
    ORDER BY 
        table1_1min.time_unix;

【问题讨论】:

  • 我假设你在 where 子句中的第二个条件应该与 table3_1min.time_unix 比较?
  • 哦,对不起,我的错。是的,你是对的!
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 多年前),不鼓励使用它

标签: mysql sql dbeaver


【解决方案1】:

new_table 中的最新行可以通过

找到

SELECT max(time_unix) FROM new_table

知道了这一点,您大概可以弄清楚如何获取新数据。我不确定您是否真的想在每次执行此操作时都创建一个新表。 TRUNCATE 可能对你有用,但我认为你想要这样的东西:

INSERT INTO new_table ( time_unix, time_mez, total )
SELECT t1.time_unix, t1.time_mez, round(t1.p + t2.p + t3.p, 2) AS total
FROM table1_1min t1 JOIN table2_1min t2 ON (t1.time_unix = t2.time_unix) JOIN table3_1min t3 ON (t1.time_unix = t3.time_unix)
WHERE t1.time_unix > (SELECT max(time_unix) FROM new_table)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多