Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to delete one specific row using Row_Number() in SQLITE?

I am new to SQL and I want to be able to perform a query to delete a certain row (NOT duplicated rows) in a table which does not have a PK (for research/learning purpose).

|--------------------------Users---------------------------|
|-ID (PK, AutoIncrement, NN)-|-username(NN)-|-password(NN)-|
|-            1             -|-    abc     -|-     abc    -|
|-            2             -|-    123     -|-     123    -|
|-            3             -|-    qwe     -|-     qwe    -|
|----------------------------------------------------------|
|---------------------------SavedCarts----------------------------|
|- user(FK references Users("id")) -|- cart_content VARCHAR(255) -|
|-               1                 -|- egg,3,milk,4,bread,4      -|
|-               1                 -|- egg,3,milk,1              -|
|-               1                 -|- egg,3,milk,2,cookie,6     -|
|-               2                 -|- egg,3,milk,3              -|
|-               2                 -|- egg,6,milk,5,cereal,5     -|
|-----------------------------------------------------------------|

In this example, the "SavedCarts" table saves the cart’s content of the logged in user. I want to delete for example "row number 3" from the SavedCarts table.

I was able to perform SELECT queries that returns ALL the cart_content of user 1 with the following script:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

SELECT ROW_NUMBER() OVER ( PARTITION BY user) RowNum, 
cart_content 
FROM SavedCarts 
WHERE user = 1;

And I was able to perform a SELECT query which returns ONLY a certain cart_content of user 1 with the following script:

SELECT * 
FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY user) RowNum FROM SavedCarts ) 
WHERE user = 1 AND RowNum = 3;

However, I could not make it work while implementing the same logic in deleting a specific row in the table (Maybe I did something wrong in the delete script). I know it is way easier to just include a PK in the table but this is for learning purpose. I have been searching online and I can only find others using ROW_NUMBER() to delete duplicate rows(which I tried using their logic as well). Can anyone tell me if deleting a row with ROW_NUMBER() is possible and suggest to me on how to achieve it?

Thank you!

I have tried:

DELETE FROM SavedCarts 
WHERE (user) IN (
   SELECT user FROM (
      SELECT user, ROW_NUMBER() OVER(PARTITION BY user) AS rownum 
      FROM SavedCarts
   ) 
   WHERE user = ? AND rownum = ?
);
DELETE FROM SavedCarts 
WHERE user IN (
   SELECT * FROM (
      SELECT *, ROW_NUMBER() OVER(PARTITION BY user) AS rownum 
      FROM SavedCarts
   ) 
   WHERE rownum = ?
);
(this deletes everything of user 1);
DELETE FROM SavedCarts 
WHERE user = ? AND ROW_NUMBER() OVER(PARTITION BY user) = ?;

Edit:
I have tried CTE, but I am getting this error:
[SQLITE_ERROR] SQL error or missing database (no such table: CTE).
Is this because SQLITE does not support CTE?
Is there a way to achieve this without CTE?

>Solution :

I want to delete for example "row number 3" from the SavedCarts table.

You can do it as :

WITH cte AS (
  SELECT rowid, ROW_NUMBER() OVER (PARTITION BY user ORDER BY rowid) AS RowNum
  FROM SavedCarts
  WHERE user = 1
)
DELETE FROM SavedCarts
WHERE rowid IN (SELECT rowid FROM cte WHERE RowNum = 3);
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading