Удалите первый результат только из SQLITE

#sql #sqlite

Вопрос:

Это код, который я запускаю:

 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

Мои данные:

идентификатор пользователя тест1 тест2
администратор 2 1
администратор 5 6

Что я хочу сделать, так это запустить команду SQL для удаления только 1 строки, но по какой-то причине она удаляет их обе.

Я не уверен, в чем моя ошибка.

Комментарии:

1. Как вы определяете, какая строка является первой строкой? по какой колонке вы бы сделали заказ?

2. Имеют ли строки уникальные идентификаторы? Если они этого не сделают, то, скорее всего, будет невозможно определить, какой из них удалить.

Ответ №1:

Если вы удаляете только на основе того user_id , как вы пытаетесь, вы удалите все записи вместе с этим user_id . Вы должны уметь различать записи.

Ниже описывается, как user_id может быть удалена первая запись каждого из них.

В таблицах SQLITE есть ROWID столбец, если в вашей схеме нет столбца автоинкрементирования. если вы это сделаете, то можете заменить его ниже. В следующих демонстрационных и предлагаемых решениях ваша схема воссоздана как общая (т. Е. Без поля автоматического увеличения) и как таковая использует файл ROWID from sqlite.

Вы можете использовать функцию окна ROW_NUMBER для определения первого вхождения и удаления из таблицы, сопоставив идентификатор отфильтрованной строки.

до

 select * from fosters_user;
 
идентификатор пользователя тест1 тест2
администратор 2 1
администратор 5 6

ВАРИАНТ 1: УДАЛИТЬ ПРИ РАССМОТРЕНИИ ТОЛЬКО ОДНОГО ИДЕНТИФИКАТОРА ПОЛЬЗОВАТЕЛЯ

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

ВАРИАНТ 2: УДАЛИТЬ ПРИ РАССМОТРЕНИИ НЕСКОЛЬКИХ ИДЕНТИФИКАТОРОВ ПОЛЬЗОВАТЕЛЕЙ

Этот подход также полезен, если вы хотите определить первое вхождение вашей записи на основе порядка другого поля. Вы можете просто обновить (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;
 
идентификатор пользователя тест1 тест2
администратор 5 6

Просмотр демо-версии на DB Fiddle

Дайте мне знать, если это сработает для вас.