【问题标题】:MYSQL UPDATE data from a SELECT subquery for all row来自所有行的 SELECT 子查询的 MYSQL UPDATE 数据
【发布时间】:2017-04-05 10:16:09
【问题描述】:

我有一个像这样的“schLoc”表

--------------------------------
| id | importo | iva  | totale |
--------------------------------
| 1  | NULL    | NULL | NULL   |
| 2  | NULL    | NULL | NULL   |
| 3  | NULL    | NULL | NULL   |
| 4  | NULL    | NULL | NULL   |
| 5  | NULL    | NULL | NULL   |
| .. | NULL    | NULL | NULL   |
--------------------------------

还有另一个像这样的“schLocDett”表,像这样 schLoc.id=schLocDett.id

---------------------------------------------
| idDoc | importo | iva  | totale | merce   |
---------------------------------------------
| 1     | 1.00    | 0.20 | 1.20   | fattLoc |
| 1     | 1.50    | 0.30 | 1.80   | fattSrv |
| 2     | 2.25    | 0.45 | 2.70   | fattLoc |
| 2     | 3.10    | 0.62 | 3.72   | notcSrv |
| 2     | 7.20    | 1.44 | 8.64   | fattSrv |
| 3     | 8.35    | 1.67 | 10.02  | fattSrv |
| 3     | 3.10    | 0.62 | 3.72   | notcSrv |
| 3     | 2.25    | 0.45 | 2.70   | fattLoc |
| 3     | 2.25    | 0.45 | 2.70   | fattLoc |
| 4     | 3.10    | 0.62 | 3.72   | notcSrv |
| 4     | 7.20    | 1.44 | 8.64   | fattSrv |
| 4     | 8.35    | 1.67 | 10.02  | fattSrv |
| ...   | ....    | .... | .....  | ....... |
---------------------------------------------

我希望 importo、iva、totale foreach idDoc 的总和和这个选择查询完美地工作:

SELECT LOC.id, SUM(DETT.importo) as importo, SUM(DETT.iva) as iva, SUM(DETT.totale) as totale  
FROM schLoc as LOC, schLocDett as DETT 
WHERE LOC.id>0 AND LOC.id=DETT.idDoc AND (DETT.merce='fattLoc' OR DETT.merce='fattSrv')
GROUP BY idDoc

但同时我想更新“schLoc”表...我尝试这样

UPDATE schLoc AS LOC 
INNER JOIN (
    SELECT SUM( importo ) AS totImporto, SUM( iva ) AS totIva, SUM( totale ) AS totTotale 
    FROM schLocDett 
   WHERE idDoc=LOC.id AND (merce='fattLoc' OR merce='fattSrv')
) AS DETT 
ON LOC.id=DETT.idDoc AND LOC.id>0
SET LOC.importo = DETT.totImporto, LOC.iva = DETT.totIva, LOC.totale = DETT.totTotale;

但不工作。

欢迎提出建议

【问题讨论】:

  • 我猜可能对外部表的引用在子查询中不起作用(idDoc=LOC.id)。如果是这样,只需添加它

标签: mysql sql select sql-update


【解决方案1】:

我会这样写查询:

UPDATE schLoc AS LOC 
INNER JOIN (
    SELECT SUM(importo) AS totImporto,
           SUM(iva)     AS totIva,
           SUM(totale)  AS totTotale,
           idDoc 
    FROM schLocDett
    WHERE merce IN ('fattLoc', 'fattSrv')
    GROUP BY idDoc
) AS DETT
    ON LOC.id = DETT.idDoc AND LOC.id > 0
SET LOC.importo = DETT.totImporto,
    LOC.iva     = DETT.totIva,
    LOC.totale  = DETT.totTotale

正如@Mihai 提到的,您似乎正在尝试加入相关的子查询,这可能不起作用。在任何情况下,更清晰的做法是对子查询中的文档进行整个聚合,然后更新连接。

【讨论】:

  • 在选择列表中添加了缺失的列希望你不介意
  • @Prdp 我一点也不介意。 Rextester 不适用于 DML 查询,而且 Fiddle 总是坏掉——不容易测试我的代码 :-(
  • 非常感谢...对,我尝试使用 Fiddle 来解释我的问题,但总是坏掉。再见
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
  • 2016-07-18
  • 1970-01-01
  • 2021-12-12
  • 2023-01-12
  • 2015-01-22
  • 1970-01-01
相关资源
最近更新 更多