如果另一个表中不存在该值,我想找到一种更新表的方法。
我的三个表的(简化)版本:
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)但没有结果。
修改
不知道是否有更简单的方法可以做到,但最后我通过在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
)