2017-07-14 100 views
0

我有一个sql查询需要一个密钥,它会输出一组记录{S}。SQLite递归交集

我怎样创建一个SQLite递归查询,需要一个组N个按键的在返回所有集合的交集{{S1},{S2},{S3}}

而不需要生成一个复制/粘贴的SQL语句。

我给个简单的例子。所以这是相交的明显答案。

SELECT record from RecordSet where key = 'KEY1' 
INTERSECT 
SELECT record from RecordSet where key = 'KEY2' 

我不想要做什么是复制和粘贴,像这样:

SELECT record from RecordSet where key = 'KEY1' 
INTERSECT 
SELECT record from RecordSet where key = 'KEY2' 
INTERSECT 
SELECT record from RecordSet where key = 'KEYN' 

而要用这里看到的递归查询功能: 递推式Example Here Under Recurisve Query Example

在哪里我可以通过所有的键

SELECT key from KEYS where key in (KEY1, KEY2, KEY3, ..., KEYN) 
To this recursive query. 
+0

,如果你发布你当前的查询是最好的。但是,这听起来像'Key in(k1,k2,k3)'可能是你所追求的。 – GolfWolf

+1

你的问题不清楚。您的数据和期望的输出的例子会有所帮助。这可能是因为你需要一个聚合函数来计算所有记录(或其唯一键),并只返回计数等于N的那些记录。 –

+0

这取决于查询实际使用密钥的方式(显然不是' key ='KEY1')。 –

回答

0

尝试查询喜欢这样的:

WITH abc AS(
    SELECT Kej, val, 
     (SELECT count(DISTINCT kej) FROM mytable b WHERE b.kej < a.kej) As cnt 
    FROM mytable a 
), 
bcd AS (
    SELECT * FROM abc WHERE cnt = (SELECT max(cnt) FROM abc) 
    UNION ALL 
    SELECT a.* FROM abc a 
    JOIN bcd b ON a.cnt = b.cnt - 1 
       AND a.val = b.val 
) 
SELECT val FROM bcd 
WHERE cnt = 0 

演示:SQL Fiddle 上述查询工作,前提是只有一个列检查交集。
如果您的表有N个colums(VAL1,VAL2,... VALN),那么连接必须包含所有这些列:

JOIN bcd b ON a.cnt = b.cnt - 1 
       AND a.val1 = b.val1 
       AND a.val2 = b.val2 
       ..... 
       AND a.valN = b.valN