【问题标题】:sqlite select all rows where some columns are in set of possible valuessqlite 选择某些列在一组可能值中的所有行
【发布时间】:2015-04-10 12:49:54
【问题描述】:
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。首先,我想找到满足某些条件的每个组合。假设为简单起见,在数据库中找到不止一次的每个三元组(在我更复杂的真实案例中需要分组和拥有):

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...)

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

【问题讨论】:

  • 该表是否具有单列主键?
  • 没有指定主键,可能只是一些自动的id可以使用

标签: sqlite


【解决方案1】:

选择具有某些值组合的行的最简单方法是使用连接:

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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 2022-12-04
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多