Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite 查询数据库中是否存在特定记录集_Sqlite - Fatal编程技术网

Sqlite 查询数据库中是否存在特定记录集

Sqlite 查询数据库中是否存在特定记录集,sqlite,Sqlite,我将各种序列存储在SQLite数据库中。每个序列都有自己的序列id,序列中的每个项在序列中都有自己的索引和值 CREATE TABLE Sequence (rowid INTEGER PRIMARY KEY, SequenceId INTEGER, Index INTEGER, Value TEXT); 例如,我可能添加的第一个序列可以是“红色”、“绿

我将各种序列存储在SQLite数据库中。每个序列都有自己的序列id,序列中的每个项在序列中都有自己的索引和值

CREATE TABLE Sequence (rowid INTEGER PRIMARY KEY, 
                       SequenceId INTEGER, 
                       Index INTEGER, 
                       Value TEXT);
例如,我可能添加的第一个序列可以是“红色”、“绿色”、“蓝色”,如下所示:

INSERT INTO Sequence (SequenceId, Index, Value) VALUES (1,1,"Red"), (1,2,"Green"), (1,3,"Blue"); 
我从另一个表中获取SequenceId。 当我准备向数据库添加新序列时,我首先要确保它还没有出现。我的第一个想法是,我可以构造一个查询来检查序列中每一行的存在性,并将它们放在一起。例如,在添加序列“Red”、“Green”、“Blue”之前,我将运行一个如下所示的查询:

SELECT
    EXISTS(SELECT * FROM Sequence 
           WHERE SequenceId = ? AND Index = 1 AND Value='Red')
    AND EXISTS(SELECT * FROM Sequence 
           WHERE SequenceId = ? AND Index = 2 AND Value='Green')
    AND EXISTS(SELECT * FROM Sequence 
           WHERE SequenceId = ? AND Index = 3 AND Value='Blue')
    AND NOT EXISTS(SELECT * FROM Sequence 
           WHERE SequenceId = ? AND Index = 4);
我不关心以前分配的实际SequenceId是什么,只要序列存在。但后来我意识到我无法确保每个EXISTS子句的
SequenceId
都是相同的


SQLite中有什么方法可以实现这一点吗?

您可以
按sequenceid分组
,并在
HAVING
子句中设置条件:

select sequenceid
from sequence
group by sequenceid
having 
  sum(`index` = 1 and `value` = 'Red') > 0
  and 
  sum(`index` = 2 and `value` = 'Green') > 0
  and
  sum(`index` = 3 and `value` = 'Blue') > 0
此代码将返回一个(或多个)包含“红色”、“绿色”和“蓝色”的现有
sequenceid
s。
请参阅。
如果不需要
sequenceid
s,请将其用作子查询:

select exists (
  select sequenceid
  from sequence
  group by sequenceid
  having 
    sum(`index` = 1 and `value` = 'Red') > 0
    and 
    sum(`index` = 2 and `value` = 'Green') > 0
    and
    sum(`index` = 3 and `value` = 'Blue') > 0
)  
请参阅。
或使用CTE:

with cte(`Index`, `Value`) as (
  select * from (
    values (1, 'Red'), (2, 'Green'), (3, 'Blue')
  )
)
select exists (
  select sequenceid
  from sequence
  where (`index`, `value`) in (select `index`, `value` from cte)
  group by sequenceid
  having count(*) = 3
) 
请参阅。