Удаление определенных строк — SQLite

Я пытаюсь удалить повторяющиеся строки из моей таблицы «exchange_transactions», связанные с именем хирурга «Люсиль Торрес», используя cte. Столбец transaction_id должен быть уникальным, но в этом случае он дублируется, поэтому мы пытаемся их удалить. Я пробовал этот код, но он не работает. Замена «DELETE» на «SELECT *» показывает мне все строки, которые я хочу удалить. Что я делаю не так?

WITH cte AS (
    SELECT 
        transaction_id,
        surgeon,  
        ROW_NUMBER() OVER (
            PARTITION BY 
                transaction_id
        ) row_num
        FROM exchange_transactions)
DELETE FROM cte
WHERE surgeon = 'Lucille Torres' AND row_num > 1

person ChrisNolanfan    schedule 20.12.2019    source источник


Ответы (2)


Используйте столбец ROWID, чтобы получить минимальное значение для каждого transaction_id, который вы не будете удалять:

delete from exchange_transactions
where surgeon = 'Lucille Torres'
and exists (
  select 1 from exchange_transactions t
  where t.surgeon = exchange_transactions.surgeon
    and t.transaction_id = exchange_transactions.transaction_id 
    and t.rowid < exchange_transactions.rowid
)
person forpas    schedule 20.12.2019

Удаление непосредственно из CTE не будет работать в SqLite.

Но если у этой таблицы есть первичный ключ (например, id)
, то результат CTE можно использовать при удалении.

Например:

WITH CTE_DUPS AS
(
  SELECT id,
  ROW_NUMBER() OVER (
      PARTITION BY surgeon, transaction_id
      ORDER BY id) AS rn
  FROM exchange_transactions
  WHERE surgeon = 'Lucille Torres'
)
DELETE 
FROM exchange_transactions
WHERE id IN (select id from CTE_DUPS where rn > 1)

Протестируйте db‹>fiddle здесь

person LukStorms    schedule 20.12.2019