更新内部联接选择语句不起作用。我有正确的语法吗?

时间:2018-03-20 08:52:42

标签: mysql sql

我正在开发一个数据库,它将使用状态表中的数据总和自动更新总计表中的数据。我需要按日期完成计算。我希望每尾每个字段有一个总数_no。每次我使用下面的代码时,都会收到语法错误。

CREATE TABLE  pc12_status (hobbs_start decimal(5,2) NOT NULL, 
                       hobbs_end decimal(5,2) NOT NULL PRIMARY KEY,
                       tail_no int(5) NOT NULL,
                       landings int(5) NOT NULL,
                       engine_cycles int(5) NOT NULL,
                       flight_date date NOT NULL);



CREATE TABLE pc12_totals (flight_hours decimal (5,2) NOT NULL,
                          landings_total int(5) NULL,
                          engine_cycles int(5) NULL,
                          flight_date date NOT NULL,
                          tail_no int(5) NOT NULL,
                          PRIMARY KEY (tail_no, flight_date));

UPDATE pc12_totals
SET pc12_totals.flight_hours = pc12_status.flight_hours,
pc12_totals.landings_total = pc12_status.landings,
pc12_totals.engine_cycles = pc12_status.engine_cycles, 
pc12_totals.flight_date = pc12_status.flight_date,
pc12_totals.tail_no = pc12_status.tail_no
FROM pc12_status
INNER JOIN (SELECT SUM(hobbs_end - hobbs_start) flight_hours,
            SUM (landings) landings_total, sum(engine_cycles) engine_cycles,
            flight_date,
            tail_no
            FROM pc12_status
            GROUP BY flight_date) 
            pc12_totals ON pc12_totals.tail_no = pc12_status.tail_no;


INSERT INTO pc12_status VALUES (1.7, 1.9, 1378, 2, 1, "1987-12-17");
INSERT INTO pc12_status VALUES (1.9, 2.8, 1378, 2, 1, "1987-12-17");
INSERT INTO pc12_status VALUES (2.8, 4.5, 1378, 2, 1, "1987-12-17");
INSERT INTO pc12_status VALUES (4.5, 6.7, 1378, 2, 1, "1987-12-18");
INSERT INTO pc12_status VALUES (6.7, 7.4, 1378, 2, 1, "1987-12-18");
INSERT INTO pc12_status VALUES (7.4, 8.9, 1378, 2, 1, "1987-12-19");

4 个答案:

答案 0 :(得分:0)

更新可以在插入行后运行,无需插入就无法更新行。所以,你应该首先插入行。另外,你必须在插入触发器后创建。但是,在你的情况下,在mysql更新查询中可能会写如下:

  UPDATE pc12_totals INNER JOIN (SELECT SUM(hobbs_end - hobbs_start) 
  flight_hours, SUM (landings) landings_total, SUM(engine_cycles) 
  engine_cycles,  flight_date,  tail_no  FROM pc12_status GROUP BY 
  flight_date, tail_no) pc12_status ON pc12_status.tail_no = 
  pc12_totals.tail_no
            SET pc12_totals.flight_hours = pc12_status.flight_hours,
            pc12_totals.landings_total = pc12_status.landings,
            pc12_totals.engine_cycles = pc12_status.engine_cycles, 
            pc12_totals.flight_date = pc12_status.flight_date,
            pc12_totals.tail_no = pc12_status.tail_no;

答案 1 :(得分:0)

语法使用join进行更新: 对于一般更新加入:

   UPDATE TABLEA a 
   JOIN TABLEB b ON a.join_colA = b.join_colB  
   SET a.columnToUpdate = [something]

因此,您的已更正查询是:

UPDATE pc12_totals
JOIN (      
            SELECT SUM(hobbs_end - hobbs_start) flight_hours,
            SUM (landings) landings_total, sum(engine_cycles) engine_cycles,
            flight_date,
            tail_no
            FROM pc12_status
            GROUP BY flight_date
    ) AS
    pc12_status ON pc12_totals.tail_no = pc12_status.tail_no
SET pc12_totals.flight_hours = pc12_status.flight_hours,
pc12_totals.landings_total = pc12_status.landings,
pc12_totals.engine_cycles = pc12_status.engine_cycles, 
pc12_totals.flight_date = pc12_status.flight_date,
pc12_totals.tail_no = pc12_status.tail_no

答案 2 :(得分:0)

请根据需要更改更新查询中的别名:

    UPDATE pc12_totals
SET pc12_totals.flight_hours = pc12_status.flight_hours,
pc12_totals.landings_total = pc12_status.landings,
pc12_totals.engine_cycles = pc12_status.engine_cycles, 
pc12_totals.flight_date = pc12_status.flight_date,
pc12_totals.tail_no = pc12_status.tail_no
FROM pc12_status
INNER JOIN (SELECT SUM(hobbs_end - hobbs_start) flight_hours,
            SUM (landings) landings_total, sum(engine_cycles) engine_cycles,
            flight_date,
            tail_no
            FROM pc12_status
            GROUP BY flight_date) 
            pc12_tota ON pc12_tota .tail_no = pc12_status.tail_no;

试试这个。

答案 3 :(得分:0)

检查一下:

它的工作 Demo

CREATE TABLE  pc12_status (hobbs_start decimal(5,2) NOT NULL, 
                       hobbs_end decimal(5,2) NOT NULL PRIMARY KEY,
                       tail_no int(5) NOT NULL,
                       landings int(5) NOT NULL,
                       engine_cycles int(5) NOT NULL,
                       flight_date date NOT NULL);



CREATE TABLE pc12_totals (flight_hours decimal (5,2) NOT NULL,
                          landings_total int(5) NULL,
                          engine_cycles int(5) NULL,
                          flight_date date NOT NULL,
                          tail_no int(5) NOT NULL,
                          PRIMARY KEY (tail_no, flight_date));


INSERT INTO pc12_status VALUES (1.7, 1.9, 1378, 2, 1, "1987-12-17");
INSERT INTO pc12_status VALUES (1.9, 2.8, 1378, 2, 1, "1987-12-17");
INSERT INTO pc12_status VALUES (2.8, 4.5, 1378, 2, 1, "1987-12-17");
INSERT INTO pc12_status VALUES (4.5, 6.7, 1378, 2, 1, "1987-12-18");
INSERT INTO pc12_status VALUES (6.7, 7.4, 1378, 2, 1, "1987-12-18");
INSERT INTO pc12_status VALUES (7.4, 8.9, 1378, 2, 1, "1987-12-19");

UPDATE pc12_totals
JOIN (      
            SELECT SUM(hobbs_end - hobbs_start) flight_hours,
            SUM(landings) landings_total, sum(engine_cycles) engine_cycles,
            flight_date,
            tail_no,landings
            FROM pc12_status
            GROUP BY flight_date
    ) AS
    pc12_status ON pc12_totals.tail_no = pc12_status.tail_no
SET pc12_totals.flight_hours = pc12_status.flight_hours,
pc12_totals.landings_total = pc12_status.landings,
pc12_totals.engine_cycles = pc12_status.engine_cycles, 
pc12_totals.flight_date = pc12_status.flight_date,
pc12_totals.tail_no = pc12_status.tail_no