如果不使用 sqlite 中的 row_number() 函数,如何提供相同的函数?

Posted

技术标签:

【中文标题】如果不使用 sqlite 中的 row_number() 函数,如何提供相同的函数?【英文标题】:How can the same function be provided without using the row_number() function in sqlite? 【发布时间】:2021-05-24 03:53:45 【问题描述】:

如果用户的手机支持 sqlite 3.25.0 或更高版本,则以下查询运行良好。否则,您可以猜到,查询不起作用。在不使用row_number()函数的情况下如何转换代码?

SELECT *
FROM
    (
        SELECT
            ROW_NUMBER() OVER (PARTITION BY recipe_name) AS rn,
            rt.*
        FROM
            SyncRecipeIngredientTable sr
            JOIN RecipeIngredientTable ri ON ri.recipe_ingredient_id = sr.recipe_ingredient_id
            JOIN RecipeTable rt ON rt.recipe_id = sr.recipe_id
        WHERE ri.recipe_item_name in ("patates", "soğan", "su")
        GROUP by rt.recipe_id
        HAVING COUNT(*) >= 3
    )
WHERE rn = 1

数据库的ER图:

预期结果:

【问题讨论】:

ROW_NUMBER() 函数不包含 ORDER BY 子句,因此在结果中您想要的具有相同 recipe_name 的行中的哪一行并不明显。发布查询结果和您的预期结果的示例数据。 还有,哪个表包含recipe_name列? @forpas 我编辑了问题请看一下 请说明您希望查询执行的操作。 @GordonLinoff 不得显示具有相同 recipe_name 的重复记录 【参考方案1】:

我希望食谱有唯一的名称。如果是这样,则根本不需要外部查询:

SELECT rt.*
FROM SyncRecipeIngredientTable sr JOIN
     RecipeIngredientTable ri 
     ON ri.recipe_ingredient_id = sr.recipe_ingredient_id JOIN
     RecipeTable rt
     ON rt.recipe_id = sr.recipe_id
WHERE ri.recipe_item_name in ('patates', 'soğan', 'su')
GROUP by rt.recipe_id
HAVING COUNT(*) >= 3;

如果食谱可以有重复的名称,那么您可以使用相关子查询:

WITH rt AS (
      SELECT rt.*
      FROM SyncRecipeIngredientTable sr JOIN
           RecipeIngredientTable ri 
           ON ri.recipe_ingredient_id = sr.recipe_ingredient_id JOIN
           RecipeTable rt
           ON rt.recipe_id = sr.recipe_id
      WHERE ri.recipe_item_name in ('patates', 'soğan', 'su')
      GROUP by rt.recipe_id
      HAVING COUNT(*) >= 3
     )
SELECT rt.*
FROM rt
WHERE rt.recipe_id = (SELECT MAX(rt2.recipe_id)
                      FROM rt rt2
                      WHERE rt2.recipe_name = rt.recipe_name
                     );

【讨论】:

以上是关于如果不使用 sqlite 中的 row_number() 函数,如何提供相同的函数?的主要内容,如果未能解决你的问题,请参考以下文章

sqlite3模块中的ROW_NUMBER函数

SQLite - 如何使用 ROW_NUMBER() OVER

如何在 sqlite 中使用 ROW_NUMBER

Sqlite 中的 ROWNumber

SQLite:仅返回每组中的前 2 个结果

SQLite 中的“如果不存在则插入”语句