Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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
Python 如何获得具有一定差异的行?_Python_Sql_Database_Sqlite - Fatal编程技术网

Python 如何获得具有一定差异的行?

Python 如何获得具有一定差异的行?,python,sql,database,sqlite,Python,Sql,Database,Sqlite,如果我有这样一张桌子: CREATE TABLE #TEMP (id1 int, id2 int, val int) INSERT INTO #TEMP VALUES(0, 0, 0) INSERT INTO #TEMP VALUES(0, 1, 1) INSERT INTO #TEMP VALUES(0, 2, 2) INSERT INTO #TEMP VALUES(0, 3, 3) INSERT INTO #TEMP VALUES(0, 4, 4) INSERT INTO #TEMP VA

如果我有这样一张桌子:

CREATE TABLE #TEMP (id1 int, id2 int, val int)

INSERT INTO #TEMP VALUES(0, 0, 0)
INSERT INTO #TEMP VALUES(0, 1, 1)
INSERT INTO #TEMP VALUES(0, 2, 2)
INSERT INTO #TEMP VALUES(0, 3, 3)
INSERT INTO #TEMP VALUES(0, 4, 4)
INSERT INTO #TEMP VALUES(0, 5, 5)
INSERT INTO #TEMP VALUES(1, 0, 0)
INSERT INTO #TEMP VALUES(1, 1, 1)
INSERT INTO #TEMP VALUES(1, 2, 2)
INSERT INTO #TEMP VALUES(1, 3, 3)
INSERT INTO #TEMP VALUES(1, 4, 4)
INSERT INTO #TEMP VALUES(1, 5, 5)
INSERT INTO #TEMP VALUES(2, 0, 0)
INSERT INTO #TEMP VALUES(2, 1, 1)
INSERT INTO #TEMP VALUES(2, 2, 2)
INSERT INTO #TEMP VALUES(3, 0, 0)
INSERT INTO #TEMP VALUES(3, 1, 1)
INSERT INTO #TEMP VALUES(3, 2, 2)
INSERT INTO #TEMP VALUES(3, 3, 3)
INSERT INTO #TEMP VALUES(3, 4, 4)
INSERT INTO #TEMP VALUES(3, 5, 5)
INSERT INTO #TEMP VALUES(4, 0, 0)
INSERT INTO #TEMP VALUES(4, 1, 1)
INSERT INTO #TEMP VALUES(4, 2, 2)

DROP TABLE #TEMP
SELECT X.id1 
FROM #TEMP X 
INNER JOIN #TEMP Y
ON (X.id2 = Y.id2)
AND (X.id1 = 2 AND Y.id1 = 3) // numbers are only for illustration
AND (Y.val - X.val = 1)
我试图获得所有唯一的
id1
,其中两个给定的
id1
可以有特定的差异(从第三列开始)。目前,我在id1和id2上添加了一个索引,并编写了如下查询:

CREATE TABLE #TEMP (id1 int, id2 int, val int)

INSERT INTO #TEMP VALUES(0, 0, 0)
INSERT INTO #TEMP VALUES(0, 1, 1)
INSERT INTO #TEMP VALUES(0, 2, 2)
INSERT INTO #TEMP VALUES(0, 3, 3)
INSERT INTO #TEMP VALUES(0, 4, 4)
INSERT INTO #TEMP VALUES(0, 5, 5)
INSERT INTO #TEMP VALUES(1, 0, 0)
INSERT INTO #TEMP VALUES(1, 1, 1)
INSERT INTO #TEMP VALUES(1, 2, 2)
INSERT INTO #TEMP VALUES(1, 3, 3)
INSERT INTO #TEMP VALUES(1, 4, 4)
INSERT INTO #TEMP VALUES(1, 5, 5)
INSERT INTO #TEMP VALUES(2, 0, 0)
INSERT INTO #TEMP VALUES(2, 1, 1)
INSERT INTO #TEMP VALUES(2, 2, 2)
INSERT INTO #TEMP VALUES(3, 0, 0)
INSERT INTO #TEMP VALUES(3, 1, 1)
INSERT INTO #TEMP VALUES(3, 2, 2)
INSERT INTO #TEMP VALUES(3, 3, 3)
INSERT INTO #TEMP VALUES(3, 4, 4)
INSERT INTO #TEMP VALUES(3, 5, 5)
INSERT INTO #TEMP VALUES(4, 0, 0)
INSERT INTO #TEMP VALUES(4, 1, 1)
INSERT INTO #TEMP VALUES(4, 2, 2)

DROP TABLE #TEMP
SELECT X.id1 
FROM #TEMP X 
INNER JOIN #TEMP Y
ON (X.id2 = Y.id2)
AND (X.id1 = 2 AND Y.id1 = 3) // numbers are only for illustration
AND (Y.val - X.val = 1)

当前,在包含1800万条记录的表上运行此查询需要4秒钟。是否有加快速度的方法?

可能是对整个表执行内部联接,然后对其应用
where
子句。这将产生一个18Mx18M=324M的表格,可能需要4秒钟

您的SQLite数据库中有吗

您是否尝试强制使用带有关键字的索引

尝试使用相关子查询,如:

select  x.id1
from    #TEMP x
where   x.id1 = 2 and
        (
        select  y.val
        from    #TEMP y
        where   y.id1 = 3
                and y.id2 = x.id2
        )
        - X.val = 1

也许这只会在索引查找时执行。

我会删除索引,然后尝试仅在val上创建索引。这是决定应该返还什么的部分。这可能会鼓励优化器首先评估差异,因此只有在差异为1的情况下才加入其中,而不是先加入所有数据,然后发现差异不是1,这是一个浪费的操作。

这个查询似乎存在严重缺陷(礼貌地说)

它可以概括为

SELECT X.id1 LABORIOUSLY FRON a_pile_of_stuff WHERE X.id1 = 2

在任何情况下,如果你在(id1,id2)上有一个索引,它应该运行得非常快。我建议您仔细检查代码和计时。有些东西不凝结。

你有关于三种颜色的索引吗?@AurelioDeRosa:我有关于
id1
id2
的索引。请原谅我的无知,为什么需要在
val
上建立索引?@AurelioDeRosa:所以我还是尝试了一下,但没有发现明显的区别。当你索引表中的所有列时,索引与磁盘上的表是相同的,因此没有提供额外的性能。