這是我正在運行的代碼:
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 | |
| 5 | 6 |
我想做的是運行一個SQL命令,只洗掉其中的1行,但由于某些原因,它同時洗掉了這兩行。
我不確定我的錯誤是什么。
uj5u.com熱心網友回復:
如果你只根據user_id進行洗掉,正如你所嘗試的那樣,你將洗掉所有具有該user_id的記錄。你必須能夠區分這些記錄。
下面描述的是如何處理這些記錄。
下面描述了如何洗掉每個user_id的第一個記錄。
SQLITE表有一個ROWID如果你的模式中沒有自動遞增的列。如果你有,那么你可以在下面替代它。下面的演示和建議的解決方案重新創建了你的共享模式(即沒有自動遞增的欄位),因此使用了來自sqlite的ROWID。
你可以使用一個視窗函式ROW_NUMBER來確定第一次出現,并通過匹配過濾后的行ID從你的表中洗掉。
BEFORE
select * from Fosters_user;
| user_id | 測驗1 | 測驗2 |
|---|---|---|
| admin | 2 | 1 | admin |
選項1:只考慮一個用戶ID時洗掉
DELETE FROM fosters_user
WHERE ROWID IN (
SELECT MIN(ROWID) as row_id
FROM fosters_user
WHERE user_id = "admin"
) ;
選項2。當考慮到多個用戶ID時洗掉
這種方法也是在考慮到多個用戶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"
) ;
沒有要顯示的結果。
AFTER
select * from Fosters_user;
| user_id | 測驗1 | 測驗2 | |
|---|---|---|---|
| admin | 5 | 6 | |
| 6 | 6 | 6 | 6 |
View Demo on DB Fiddle
讓我知道這是否對你有用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/327124.html
標籤:
