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

时间:2017-07-07 20:08:59

标签: c# sqlite constraints operations

我有一个关于在SQLite中选择的问题。我在DB中输入了条目,我需要选择符合我标准的所有行。这些标准可以与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查询)。 这给了我 21 155 243 的图片。

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

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

    • 这应该会产生图像 21 155 243 312
  3. 此外,我想要排除一些带有 NOT 约束的条目。例如,我希望每个条目都带有标签35,但不是带有标签40的条目。

    • 结果是图像 155 243
  4. 如何使用SQLite查询实现此目的?我知道,如何在条目中搜索多个条件,但我此时不知道如何使用此约束搜索多个条目。我可以通过选择两个不同的列表来解决这个问题,然后将交叉 union 除了之外。但我认为,必须有更好,更直接的方式。

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

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

    提前感谢您的帮助

    亲切的问候 Ramon的

    (请保留我的一些英语错误;这是免费的;)

1 个答案:

答案 0 :(得分:0)

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

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