【问题标题】:Delete first result only from SQLITE仅从 SQLITE 中删除第一个结果
【发布时间】:2021-09-17 02:59:51
【问题描述】:

这是我正在运行的代码:

DELETE FROM fosters_user 
WHERE user_id = (SELECT "admin" FROM fosters_user);

我还尝试了在论坛上找到的其他东西:

DELETE FROM fosters_user 
WHERE user_id IN (SELECT user_id FROM fosters_user 
                  WHERE user_id = "admin" LIMIT 1)

表名 = fosters_user

我的数据:

user_id test1 test2
admin 2 1
admin 5 6

我想要做的是运行一个 SQL 命令来只删除其中的 1 行,但由于某种原因它会删除它们。

我不确定我的错误是什么。

【问题讨论】:

  • 如何确定哪一行是第一行?您会按哪一列排序?
  • 行是否有唯一的 ID?如果他们不这样做,则可能无法确定要删除哪一个。

标签: sql sqlite


【解决方案1】:

如果您在尝试时仅根据user_id 进行删除,您将删除具有该user_id 的所有记录。您必须能够区分记录。

下面描述如何删除每个user_id的第一条记录。

如果架构中没有自动递增列,SQLITE 表有一个ROWID。如果你这样做,那么你可以在下面替换它。以下演示和建议的解决方案将您的架构重新创建为共享(即没有自动递增字段),因此使用来自 sqlite 的 ROWID

您可以使用窗口函数ROW_NUMBER 来确定第一次出现并通过匹配过滤后的行 id 从表中删除。

之前

select * from fosters_user;
user_id test1 test2
admin 2 1
admin 5 6

选项 1:仅考虑一个用户 ID 时删除

DELETE FROM fosters_user
WHERE ROWID IN  (
    SELECT MIN(ROWID) as row_id
    FROM fosters_user
    WHERE  user_id = "admin"
) ;

选项 2:在考虑多个用户 ID 时删除

如果您想根据另一个字段的顺序来确定记录的第一次出现,这种方法也很有用。您可以简单地将(PARTITION BY user_id ORDER BY ROWID) 更新为(PARTITION BY user_id ORDER BY your_column_of_choice)

DELETE FROM fosters_user
WHERE ROWID IN  (
    SELECT row_id FROM (
        SELECT 
            ROWID as row_id,
            ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY ROWID) rn
        FROM fosters_user
    ) t
    WHERE rn = 1 and user_id = "admin"
) ;

没有要显示的结果。


之后

select * from fosters_user;
user_id test1 test2
admin 5 6

View Demo on DB Fiddle

让我知道这是否适合你。

【讨论】:

    猜你喜欢
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2011-12-11
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    相关资源
    最近更新 更多