更新表,其中SELECT id来自tableB不存在

时间:2018-04-13 09:21:24

标签: mysql

如果另一个表中不存在该值,我想找到一种更新表的方法。

我的三个表的(简化)版本:

Table_A         Table_B                     Table_C
                                            (idA + typ = PRIMARY key)
idA | name      id | idA | typ | amm        idA | typ | name | total
10  | Dodo      1  | 10  |  1  |   1        10  |  1  | Dodo |   2
                2  | 10  |  1  |   1        10  |  2  | Dodo |   4
                3  | 10  |  2  |   2        10  |  3  | Dodo |   6
                4  | 10  |  2  |   2        10  |  4  | Dodo |   8
                5  | 10  |  3  |   3
                6  | 10  |  3  |   3
                7  | 10  |  4  |   4 *
                8  | 10  |  4  |   4 *

我使用此查询更新Table_C

INSERT INTO Table_C 
    ( idA , name , typ , total )
SELECT 
    tX.idA , tX.name , tX.typ , tX.total
FROM (
     SELECT tA.idA , tA.name,
           tB.typ , tB.total
     FROM table_A `tA`

     LEFT JOIN (
         SELECT 
            idA , typ , SUM(amm) total
            FROM table_B `tB`                 <<here
            GROUP BY idA,typ                 
         ) tB
        ON tA.idA = tB.idA
        WHERE tA.idA = 10
) tX
                                              <<here
ON DUPLICATE KEY UPDATE
   idA = tX.idA,
   name = tX.name,
   typ = tX.typ,
   total = tX.total

这很好用。但现在我从typ 4删除Table_B,然后我再次更新。

问题是:上述查询中是否有办法设置缺失total(以及任何其他缺失类型)的值(或至少typ 4) )为零?结果将是:

Table_C
idA | typ | name | total
10  |  1  | Dodo |   2
10  |  2  | Dodo |   4
10  |  3  | Dodo |   6
10  |  4  | Dodo |   0  <<<<

我尝试在<<here

添加
   LEFT JOIN table_C tC
   ON ?.idA = tC.idA AND ?.typ = tC.typ 
   WHERE tC.typ IS NULL

(其中?= tB或tX)但没有结果。

Here is a Fiddle

修改

不知道是否有更简单的方法可以做到,但最后我通过在WHERE tA.idA = 10之后添加这篇文章来解决它:

UNION ALL (
    SELECT idA, "", typ , 0
    FROM table_C tC
    WHERE NOT EXISTS 
        (SELECT 
            idA, typ
            FROM table_B tB
            WHERE tC.idA = tB.idA AND 
                tC.typ = tB.typ
            GROUP BY idA,typ
        )
    AND idA=10
    GROUP BY idA,typ
)

0 个答案:

没有答案