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