如何使用加权子选择正确执行SQL UPDATE?

时间:2010-04-24 07:49:29

标签: sql sqlite

我可能试图在单个查询中完成太多,但我有一个sqlite数据库,格式错误的食谱。这将返回已添加相关性的配方的已排序列表:

SELECT *, sum(relevance) FROM (
  SELECT *,1 AS relevance FROM recipes WHERE ingredients LIKE '%milk%' UNION ALL
  SELECT *,1 AS relevance FROM recipes WHERE ingredients LIKE '%flour%' UNION ALL
  SELECT *,1 AS relevance FROM recipes WHERE ingredients LIKE '%sugar%'
) results GROUP BY recipeID ORDER BY sum(relevance) DESC;

但我现在遇到一个特殊情况,我需要将相关值写入与食谱相同的行中的字段。我在这些方面找到了一些东西:

UPDATE recipes SET relevance=(SELECT sum(relevance) ...)

但是我还没有能够使用它。我会继续努力,但同时请告诉我你将如何处理这个问题?

编辑:评估Peter的解决方案,由于必须执行操作的数据量,我遇到了一些严重的性能问题。我写了一个小的Rebol脚本,它执行循环和查找,并以1000行批量提交。它在几分钟内完成。

1 个答案:

答案 0 :(得分:2)

你真的应该修复你的模型(见下文)。

如果你不能,下面的查询应该可以工作(我试过它,它按照我的预期工作)。

Update recipes
Set relevance =
(
  Select   Case When ingredients Like '%milk%' Then 1 Else 0 End
         + Case When ingredients Like '%flour%' Then 1 Else 0 End
         + ...
  From recipes r2
  Where r2.recipe_id = recipes.recipe_id
)

它使用Case来总结所有匹配的成分。


推荐型号:

  • recipes

  • ingredients

  • recipe_ingredients

    • recipe_id
    • ingredient_id