如何在SQLite查询中找出ID差值不超过3的行对(元组)
解决方法:用自连接找出ID差值≤3的行对
嘿,这个问题用SQL的**自连接(Self-Join)**就能轻松搞定,刚好SQLite完全支持这种操作。咱们直接上方案:
核心思路
把表和自己做连接,筛选出两个行的ID差值绝对值在1到3之间的配对(排除自己和自己配对的情况),同时通过a.id < b.id避免重复的反向配对(比如既出现(2,5)又出现(5,2))。
完整代码示例
结合你给出的数据集,完整的Python+SQLite代码如下:
import sqlite3 db = sqlite3.connect(':memory:') c = db.cursor() c.execute('CREATE TABLE mytable (id integer, description text)') c.execute('INSERT INTO mytable VALUES (2, "abc")') c.execute('INSERT INTO mytable VALUES (5, "def")') c.execute('INSERT INTO mytable VALUES (18, "geh")') c.execute('INSERT INTO mytable VALUES (19, "ijk")') c.execute('INSERT INTO mytable VALUES (27, "lmn")') # 执行查询,找出符合条件的行对 c.execute(''' SELECT a.id AS id1, a.description AS desc1, b.id AS id2, b.description AS desc2 FROM mytable a JOIN mytable b ON ABS(a.id - b.id) BETWEEN 1 AND 3 AND a.id < b.id ''') # 输出结果 print("符合条件的行对:") for row in c.fetchall(): diff = abs(row[0] - row[2]) print(f"ID {row[0]} ({row[1]}) ↔ ID {row[2]} ({row[3]}),差值:{diff}") db.close()
运行结果
执行后你会得到以下输出:
符合条件的行对: ID 2 (abc) ↔ ID 5 (def),差值:3 ID 18 (geh) ↔ ID 19 (ijk),差值:1
替代优化写法
如果想避免计算绝对值,也可以用更直接的范围判断,这样性能可能更好(尤其是数据量大的时候):
SELECT a.id AS id1, a.description AS desc1, b.id AS id2, b.description AS desc2 FROM mytable a JOIN mytable b ON b.id BETWEEN a.id + 1 AND a.id + 3;
这个写法和上面的查询结果完全一致,因为它直接限定b.id比a.id大1到3,天然避免了重复配对和自配对。
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

