我需要删除 SQLite 表中的一些行,其中两列作为主键,如下所示:
DELETE FROM apt_lang
WHERE (apt_fk, apt_lang_fk) NOT IN ((42122,"en"),(42123,"es"),(42123,"en"))
这适用于 Oracle 和 MySQL,但不适用于 SQLite。
谁能帮帮我?
最佳答案
首先,找出要删除的行。 最简单的方法是使用连接:
SELECT *
FROM apt_lang
JOIN (SELECT 42122 AS apt_fk, 'en' AS apt_lang_fk UNION ALL
SELECT 42123 , 'es' UNION ALL
SELECT 42123 , 'en' )
USING (apt_fk, apt_lang_fk)
要将其与 DELTE 一起使用,请检查 EXISTS 是否匹配:
DELETE FROM apt_lang
WHERE NOT EXISTS (SELECT 1
FROM apt_lang AS a2
JOIN (SELECT 42122 AS apt_fk, 'en' AS apt_lang_fk UNION ALL
SELECT 42123 , 'es' UNION ALL
SELECT 42123 , 'en' )
USING (apt_fk, apt_lang_fk)
WHERE apt_fk = apt_lang.apt_fk
AND apt_lang_fk = apt_lang.apt_lang_fk)
或获取 ROWID子查询的 s 并检查那些:
DELETE FROM apt_lang
WHERE rowid NOT IN (SELECT apt_lang.rowid
FROM apt_lang
JOIN (SELECT 42122 AS apt_fk, 'en' AS apt_lang_fk UNION ALL
SELECT 42123 , 'es' UNION ALL
SELECT 42123 , 'en' )
USING (apt_fk, apt_lang_fk))
关于sqlite - 如何在 SQLite 中删除具有 2 列作为复合主键的多行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29073838/