如何使用加权子选择正确执行SQL更新?
我可能试图在一个查询中完成太多的工作,但我有一个sqlite数据库,其中包含格式不正确的配方。这将返回添加了相关性的已排序食谱列表:如何使用加权子选择正确执行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%
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
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
)