我需要一个查询,通过选择整个表开始,然后会有一些查询从第一个查询中删除条目。我通过使用几个查询然后比较我的应用程序中的结果来完成此操作。我想知道我是否可以在一次查询中完成此任务。
算法
从表
从表中选择AccountIDs,其中parameter1 = true
从原始查询结果
从表中选择AccountIDs,其中parameter2 = true
从剩余的查询结果
以及最多N个参数。
这还需要兼容mySQL和SQLite
答案 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
...)