mySQL / SQlite减法查询

时间:2013-03-18 15:06:30

标签: mysql sql sqlite

我需要一个查询,通过选择整个表开始,然后会有一些查询从第一个查询中删除条目。我通过使用几个查询然后比较我的应用程序中的结果来完成此操作。我想知道我是否可以在一次查询中完成此任务。

算法

  1. 从表

  2. 中选择所有帐户ID
  3. 从表中选择AccountIDs,其中parameter1 = true

  4. 从原始查询结果

  5. 中删除这些匹配项
  6. 从表中选择AccountIDs,其中parameter2 = true

  7. 从剩余的查询结果

  8. 中删除这些匹配项
  9. 以及最多N个参数。

  10. 这还需要兼容mySQL和SQLite

2 个答案:

答案 0 :(得分:2)

我认为你正在寻找这个:

SELECT AccountID FROM the_table
LEFT JOIN (
    SELECT AccountID FROM the_table
    WHERE
        parameter1 = true OR
        ... OR
        parameterN = true ;
) AS not_included USING (AccountID)
WHERE not_included.AccountID IS NULL -- only items with no match in the "not_included" sub-query

not_included子查询返回任何参数设置为TRUE的所有项目。实际上,您希望从最终结果集中排除这些记录。

然后LEFT-JOIN the_table(即所有项目)到此子结果。 WHERE...IS NULL子句排除了the_table中但not_included中不存在的项目。

因此,只有想要排除的项目才会保留在最终结果集中。

答案 1 :(得分:2)

实施算法的最直接方法是使用compound SELECT statement

SELECT AccountID FROM MyTable
EXCEPT
SELECT AccountID FROM MyTable WHERE parameter1 = 1
EXCEPT
SELECT AccountID FROM MyTable WHERE parameter2 = 1

但是,使用单个WHERE表达式也可以这样做:

SELECT AccountID
FROM MyTable
WHERE NOT (parameter1 = 1 OR
           parameter2 = 1 OR
           ...)