1

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

算法

  1. 从表中选择所有 AccountID

  2. 从其中 parameter1 = true 的表中选择 AccountIDs

  3. 从原始查询结果中删除这些匹配项

  4. 从参数 2 = true 的表中选择 AccountIDs

  5. 从剩余的查询结果中删除这些匹配项

  6. 依此类推,最多 N 个参数。

这还需要与 mySQL 和 SQLite 兼容

4

2 回答 2

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

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

于 2013-03-18T15:16:50.003 回答
2

实现算法的最直接方法是使用复合 SELECT 语句

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
           ...)
于 2013-03-18T15:47:04.317 回答