2

我一整天都在努力解决这个问题。我在这里发帖希望有人能够帮助我。

我正在尝试通过添加它们来修复缺少值的数据库。

假设我们有以下表格:

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。

4

3 回答 3

3
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
于 2013-09-10T17:43:02.073 回答
2

Updated基于没有丢失的迭代

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;
于 2013-09-10T17:55:48.480 回答
1
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
于 2013-09-10T17:56:12.290 回答