2015-02-10 108 views
2
col0 col1 col2 A B C 
0 0 1 1 2 3 
0 1 1 1 2 3 
0 0 1 1 2 3 
0 2 0 1 2 3 
0 1 1 1 2 3 

您好,我有一个表,其中一些列是col0,col1,col2。首先,我想找到符合某些条件的每种组合。比方说,为了简单起见,找到每个三是在数据库中超过一次(GROUP BY和已经在我的更复杂的现实情况下需要):sqlite选择所有行中的某些列在可能值集

SELECT col0,col1,col2 FROM table GROUP BY col0,col1,col2 HAVING COUNT(*) > 1 

给了我这样的:

col0 col1 col2 
0 0 1 
0 1 1 

现在我想选择(实际删除)所有包含col0,col1,col2组合之一的行。

因此,像:

SELECT * FROM table WHERE (col0,col1,col2) IN (...select above...) 

但是,这给了我一个错误,我想只是一列被允许在WHERE子句中的SQLite。所以可能需要使用某种连接,但是我需要正确使用连接的语法和类型。如何进行?谢谢。

+0

该表是否是单列主键? – 2015-02-10 14:53:24

+0

没有指定主键,可能只是一些自动ID可以使用 – Martin 2015-02-10 18:31:18

回答

2

来选择值具有一定的组合行最简单的方法是使用一个连接:

SELECT MyTable.* 
FROM MyTable 
JOIN (SELECT col0, col1, col2 
     FROM MyTable 
     GROUP BY col0, col1, col2 
     HAVING COUNT(*) > 1) 
USING (col1, col2, col3) 

加入不与DELETE工作,所以你必须使用主键(或候选主键)在一个单独的步骤中:

DELETE FROM MyTable 
WHERE rowid IN (SELECT MyTable.rowid 
       FROM MyTable 
       JOIN (SELECT col0, col1, col2 
         FROM MyTable 
         GROUP BY col0, col1, col2 
         HAVING COUNT(*) > 1) 
       USING (col1, col2, col3)) 
+0

完美,伟大的作品!非常感谢你! – Martin 2015-02-11 10:22:00