SQLite:查询排除行,具体取决于其他列的值组合

时间:2014-06-23 07:23:57

标签: sql sqlite

对标题不清楚道歉,但如果没有例子,很难描述。 我有一张表可以总结如下:

Position_X     Position_Y    Position_Z    ValuesA    ValuesB   ValuesC 
10             30            500           value      other     another
5              45            2             value2     other2    another2
45             0             75            value3     other3    another3

我需要使用特定条件提取数据,但我必须提供Position_XPosition_YPosition_Z的特定组合。我手头有我要排除的组合列表。

当我使用这3个值的组合点击一行时,该行应从查询中排除。

所以我的假设查询将是(例如简化)

SELECT ValuesA, ValuesB, ValuesC FROM mytable WHERE <other parameters>
AND ... <condition here>

要参考该示例,将使用哪个查询来排除(10,30,500)和(45,0,75)的行?

请注意,我需要在实际数据上排除的值列表大约有40个3值组合。

这可能吗?

2 个答案:

答案 0 :(得分:2)

我认为将这些组合放在一个单独的表中是有意义的。这也可以使您的查询更短。

SELECT ValuesA, ValuesB, ValuesC
FROM mytable t
WHERE other_parameter="found" 
AND NOT EXISTS (SELECT * FROM CombinationsTable
                WHERE t.x = x AND t.y = y AND t.z = z);

如果由于某种原因你不想使用单独的表,你会得到这样的结果:

SELECT ValuesA, ValuesB, ValuesC
FROM mytable t
WHERE other_parameter="found" 
AND NOT (x = 10 AND y = 20 AND z = 30)
AND NOT (x = 20 AND y = 30 AND z = 40)
AND NOT (etc.)

答案 1 :(得分:1)

可以使用common table expression

创建虚拟表
WITH
excluded_positions(position_x, position_y, position_z) AS (
  VALUES (10, 30, 500),
         (45, 0, 75),
         ...),
excluded_rowids AS (
  SELECT mytable.rowid
  FROM mytable
  JOIN excluded_positions USING (position_x, position_y, position_z))
SELECT ValuesA, ValuesB, ValuesC
FROM mytable
WHERE ...
  AND rowid NOT IN excluded_rowids