Mysql 如果缺少值,则执行SQL插入

Mysql 如果缺少值,则执行SQL插入,mysql,sql,Mysql,Sql,我一整天都在为这个问题绞尽脑汁。我在这里发帖,希望有人能帮助我 我试图通过添加值来修复缺少值的数据库 假设我们有以下表格: Color with columns (itemId, colorId) Process with columns (itemId, colorId, iteration, rating) 仅当评级大于0时,流程才包含条目。我想通过为每个迭代添加评级为==0的缺失条目来修复这个问题 例如,表进程包含: item id | color id | iteration | ra

我一整天都在为这个问题绞尽脑汁。我在这里发帖,希望有人能帮助我

我试图通过添加值来修复缺少值的数据库

假设我们有以下表格:

Color with columns (itemId, colorId)
Process with columns (itemId, colorId, iteration, rating)
仅当评级大于0时,流程才包含条目。我想通过为每个迭代添加评级为==0的缺失条目来修复这个问题

例如,表进程包含:

item id | color id | iteration | rating
   1    |    1     |    1      |    1
   1    |    1     |    2      |    2
   1    |    1     |    3      |    2
   1    |    2     |    3      |    1
   1    |    1     |    4      |    5
   1    |    2     |    4      |    5
缺少的条目包括:

item id | color id | iteration | rating
   1    |    2     |    1      |    0
   1    |    2     |    2      |    0
我是SQL的初学者,对连接不太熟悉。我正在考虑使用插入-选择组合和联接。也许是交叉连接

我将非常感谢你的帮助!非常感谢

PS:我正在使用mysql,但我想这不会影响答案

编辑:感谢您提出的解决方案。但是,它们都不起作用,因为假定列迭代没有缺少的值。然而,对我来说就是这样。请将迭代视为另一个ID,而不是必要的增量…

所以我真正想要的是,无论何时,对于给定的itemId和迭代,在表进程中有一个条目,那么每个colorId都有一个条目与表Color中的itemId相匹配。此缺失条目的评级应为0。

根据无缺失迭代进行更新

SELECT
P.itemId
,C.colorId
,I.iteration
,0 AS rating
FROM
(SELECT DISTINCT itemId FROM Process) P
CROSS JOIN
(SELECT DISTINCT colorId FROM Color) C
CROSS JOIN
(SELECT DISTINCT iteration FROM Process) I
LEFT JOIN
Process E
ON P.itemId = E.itemId
AND C.colorId = E.colorId
AND I.iteration = E.iteration

WHERE E.rating IS NULL
INSERT INTO process (itemId, colorId, iteration, rating)
SELECT p1.itemId, p1.colorId, i.iteration, 0
  FROM (SELECT itemId, colorId, MAX(iteration) as max_iteration
          FROM process
         GROUP BY itemId, colorId
       ) p1
 INNER
  JOIN (SELECT DISTINCT iteration FROM process) i
    ON i.iteration < p1.max_iteration
  LEFT OUTER
  JOIN process p2
    ON p2.itemId    = p1.itemId
   AND p2.colorId   = p1.colorId
   AND p2.iteration = i.iteration
 WHERE p2.iteration IS NULL;

你有主键或唯一约束吗?你在当前数据中有迭代的上限吗?@初学者Java我试图将我的问题简化为这个玩具问题。所以我想说colorId是颜色的主键,而对于过程来说,实际上没有主键,有一个auto inc id,但我想它是不相关的…@gwc在当前数据中没有迭代的上限。@Laohike-为什么项目\u id=1,颜色\u id=2,迭代=1,评级=0是一个缺少的条目,但是项目\u id=1,颜色\u id=1,迭代=1,评级=0颜色\u id 1而不是2不是缺少的条目?假设整个迭代范围存在于流程表中。整个问题是迭代中的间隙。我们不能确定每个迭代次数是否存在。如果迭代6存在,但从未输入迭代5,该怎么办?如果是这种情况,您可以在mySql中为迭代创建一个CTE。编辑:我看到你已经做了类似的事情。这个答案的答案对于问题中设置的给定数字是正确的。我尝试在插入没有离开选择的情况下插入,但没有得到结果。也许我做错了什么?这句话适用于OP给出的示例,也适用于另一种颜色没有任何项目迭代评级的情况。
INSERT INTO Process (item,color,iteration,rating)
SELECT C.item, C.color, I.iteration, 0 FROM Color C
CROSS JOIN (SELECT DISTINCT iteration FROM Process) I
LEFT JOIN Process P
ON P.item=C.item AND P.color=C.color AND P.iteration=I.iteration
WHERE P.rating IS NULL