MySQL的。子查询

时间:2016-09-19 14:06:25

标签: mysql sql subquery

我对此感到困惑,需要一些帮助。

我有这些表格:

1)PRODUCTOS(产品)

+-------------+-----------------------------+---------------+------------------+
| PRODUCTO_NO | DESCRIPCION                 | PRECIO_ACTUAL | STOCK_DISPONIBLE |
+-------------+-----------------------------+---------------+------------------+
|          10 | MESA DESPACHO MOD. GAVIOTA  |        550.00 |               50 |
|          20 | SILLA DIRECTOR MOD. BUFALO  |        670.00 |               25 |
|          30 | ARMARIO NOGAL DOS PUERTAS   |        460.00 |               20 |
|          50 | ARCHIVADOR CEREZO           |       1050.00 |               20 |
|          60 | CAJA SEGURIDAD MOD B222     |        280.00 |               15 |
|          70 | DESTRUCTORA DE PAPEL A3     |        450.00 |               25 |
|          80 | MODULO ORDENADOR MOD. ERGOS |        550.00 |               25 |
+-------------+-----------------------------+---------------+------------------+

2)PEDIDOS(订单)

+-----------+-------------+------------+----------+--------------+
| PEDIDO_NO | PRODUCTO_NO | CLIENTE_NO | UNIDADES | FECHA_PEDIDO |
+-----------+-------------+------------+----------+--------------+
|      1000 |          20 |        103 |        3 | 1999-10-06   |
|      1001 |          50 |        106 |        2 | 1999-10-06   |
|      1002 |          10 |        101 |        4 | 1999-10-07   |
|      1003 |          20 |        105 |        4 | 1999-10-16   |
|      1005 |          30 |        105 |        2 | 1999-10-20   |
|      1006 |          70 |        103 |        3 | 1999-11-03   |
|      1007 |          50 |        101 |        2 | 1999-11-06   |
|      1008 |          10 |        106 |        6 | 1999-11-16   |
|      1009 |          20 |        105 |        2 | 1999-11-26   |
|      1011 |          30 |        106 |        2 | 1999-12-15   |
|      1012 |          10 |        105 |        3 | 1999-12-06   |
|      1013 |          30 |        106 |        2 | 1999-12-06   |
|      1014 |          20 |        101 |        4 | 2000-01-07   |
|      1015 |          70 |        105 |        4 | 2000-01-16   |
|      1017 |          20 |        105 |        6 | 2000-01-20   |
+-----------+-------------+------------+----------+--------------+

现在,我要做的是更新表'PROXTOS'中的'STOCK_DISPPONIBLE'(可用库存)列,从中减去每个库存商品的订购总数。这意味着,例如我将Table作为产品编号10,我必须完成所有订单并查看已订购的表数,并从可用表的总数中减去该数字。我提出的不起作用(好吧,如果它确实有效,我就不会在这里)。

update PRODUCTOS set STOCK_DISPONIBLE= (STOCK_DISONIBLE - (select sum(p1.UNIDADES) from PEDIDOS p1 join PRODUCTOS p2 on p1.PRODUCTO_NO = p2.PRODUCTO_NO));

这可能是逻辑在这里绝对不可靠。但是我迷失了这个,如果有人可以帮助我,我会非常感激。

2 个答案:

答案 0 :(得分:2)

我认为你想要一个简单的相关子查询:

update PRODUCTOS p
    set p.STOCK_DISPONIBLE = (p.STOCK_DISONIBLE -
                              (select sum(pe.UNIDADES)
                               from PEDIDOS pe 
                               where pe.PRODUCTO_NO = p.PRODUCTO_NO
                              )
                             );

子查询中的join是不必要的。

答案 1 :(得分:0)

您可以将UPDATEJOIN一起用于表格PEDIDOS的汇总版本:

UPDATE PRODUCTOS AS p1
JOIN (
   SELECT PRODUCTO_NO, SUM(UNIDADES) AS total_units
   FROM PEDIDOS 
   GROUP BY PRODUCTO_NO
) AS p2 ON p1.PRODUCTO_NO = p2.PRODUCTO_NO
SET p1.STOCK_DISPONIBLE = p1.STOCK_DISPONIBLE - p2.total_units  

Demo here