Select SQLite 中的多个条目,其中多行需要匹配相同的条件(包括 AND、OR 和 NOT)

Select multiple entries in SQLite where multiple rows need to match the same condition (including AND, OR and NOT)

我对 SQLite 中的 selecting 有疑问。我在数据库中给出了条目,我需要 select 所有符合我的标准的行。这些条件可以与 AND、OR 或 NOT 组合。

比如我有

     id  |  image  |  tag
    -----|---------|------
     21  |     21  |   35
     25  |    240  |   45
     36  |     21  |   40
     43  |    155  |   35
     56  |    243  |   35
     65  |    312  |   40

作为我数据库中的数据。

我现在想做的是搜索例如所有带有标签 35 的条目。到目前为止很简单(简单的 SELECT 查询)。 这给了我图像 21155243.

  1. 但是现在,我想要每个带有标签 35 的条目,但只有那些标签也有 40 的条目。这将是一个 AND 约束。

    • 这只会导致 21
  2. 除了 AND 约束之外,我还想搜索标签为 35 的条目,但也搜索标签为40(OR 约束)。

    • 这应该导致图像 21155243312
  3. 此外,我想排除一些带有 NOT 约束的条目。例如,我想要每个带有标签 35 的条目,但不是带有标签 40 的条目。

    • 这将是图像 155243

如何使用 SQLite 查询实现此目的?我知道如何在条目内搜索多个条件,但我现在不知道如何使用此约束搜索多个条目。我可以通过 selecting 两个不同的列表,然后 intersectunionexcept[=65 来解决这个问题=] 他们彼此。但是我觉得,一定有更好更直接的方法。

我希望可以实现这个目标,而无需编写包含数千个 sql 语句的长得可怕的查询。 ;)

有人知道如何搜索上述条目吗?

提前感谢您的帮助

亲切的问候 拉蒙

(请保留我的一些英文错误;有免费的;))

使用复合查询是最简单的解决方案:

SELECT image FROM data WHERE tag = 35
INTERSECT
SELECT image FROM data WHERE tag = 40;

SELECT image FROM data WHERE tag = 35
UNION
SELECT image FROM data WHERE tag = 40;

SELECT image FROM data WHERE tag = 35
EXCEPT
SELECT image FROM data WHERE tag = 40;

也可以使用 correlated subqueries:

  1. 标签为 35 的所有条目,其中存在具有相同图像和标签 40 的行:

    SELECT *
    FROM data
    WHERE tag = 35
      AND EXISTS (SELECT *
                  FROM data AS d2
                  WHERE d2.image = data.image
                    AND d2.tag = 40);
    
  2. 没什么复杂的:

    SELECT DISTINCT image
    FROM data
    WHERE tag IN (35, 40);
    
  3. 标签为 35 且不存在具有相同图像和标签 40 的行的所有条目:

    SELECT *
    FROM data
    WHERE tag = 35
      AND NOT EXISTS (SELECT *
                      FROM data AS d2
                      WHERE d2.image = data.image
                        AND d2.tag = 40);