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

如何使用加权子选择正确执行SQL更新?,sql,sqlite,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%

我可能试图在一个查询中完成太多的工作,但我有一个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行批中执行提交。它在几分钟内就完成了。

你真的应该把你的模型修好(见下文)

如果不能,那么下面的查询应该可以工作(我尝试了它,它按照我的预期工作)

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


建议型号:

  • 配方

  • 成分

  • recipe\u配料

    • recipe\u id
    • 成分id

我同意,但一开始就太破碎了。这看起来基本上是一个html的刮擦,我没有regexp-fu来正确划分成分。幸运的是,如果我能把相关的东西整理好,我就不用再碰它了……)@luminarious:那么,请确保尝试我提供的查询:)语法是否意味着自动求和,或者您只是错过了
SUM
调用?@newtover:这就是添加(
+
)单独的
Case
子句的目的。每一个匹配的成分都会产生
1
,我正在总结所有这些。我没有在这里分组任何行,因此
SUM
将不起作用。很抱歉,我遗漏了配方的所有元素都存储在一行中。
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
)