Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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_Constraints - Fatal编程技术网

SQLite查找列子集满足指定约束的表行

SQLite查找列子集满足指定约束的表行,sqlite,constraints,Sqlite,Constraints,我有下面的SQLite表 CREATE TABLE visits(urid INTEGER PRIMARY KEY AUTOINCREMENT, hash TEXT,dX INTEGER,dY INTEGER,dZ INTEGER); 典型的内容是 # select * from visits; urid | hash | dx | dY | dZ ------+-----------+-------+--------+

我有下面的SQLite表

CREATE TABLE visits(urid INTEGER PRIMARY KEY AUTOINCREMENT,
                    hash TEXT,dX INTEGER,dY INTEGER,dZ INTEGER);
典型的内容是

# select * from visits;
  urid |  hash     |  dx   |   dY   |   dZ
 ------+-----------+-------+--------+------
   1   |  'abcd'   |  10   |   10   |   10  
   2   |  'abcd'   |  11   |   11   |   11
   3   |  'bcde'   |   7   |    7   |    7  
   4   |  'abcd'   |  13   |   13   |   13 
   5   |  'defg'   |  20   |   21   |   17
这里我需要做的是为满足约束的表行识别
urid

hash = 'abcd' AND (nearby >= (abs(dX - tX) + abs(dY - tY) + abs(dZ - tZ))
最小偏差-指绝对距离的最小和

在目前的情况下

 nearby = 7
 tX = tY = tZ = 12
有三行满足上述约束,但有不同的偏差

  urid |  hash     |  dx   |   dY   |   dZ   |   deviation
 ------+-----------+-------+--------+--------+---------------
   1   |  'abcd'   |  10   |   10   |   10   |       6
   2   |  'abcd'   |  11   |   11   |   11   |       3
   4   |  'abcd'   |  12   |   12   |   12   |       3 
在这种情况下,我想报告
urid=2
urid=3
——我实际上不在乎报告哪一个

在我自己的设备上,我将获取完整的匹配行集,然后在我自己的Java代码中,逐步找到与我的第二个约束(最小偏差)匹配的行。然而,我怀疑这不是必需的,它可以单独在SQL中完成。遗憾的是,我对SQL的了解在这里太有限了。我希望这里有人能让我走上正确的道路


我现在已经做到了以下几点

CREATE TEMP TABLE h1(v1 INTEGER,v2 INTEGER);
SELECT urid,(SELECT (abs(dX - 12) + abs(dY - 12) + abs(dZ - 12))) devi FROM visits WHERE hash = 'abcd';

--SELECT * FROM h1 
  urid |  devi     |
-------+-----------+
   1   |    6      |
   2   |    3      |
   4   |    3      | 
随后我发布

select urid from h1 order by v2 asc limit 1;

这就产生了urid=2,我所追求的结果。虽然这是可行的,但我想知道是否有更好/更简单的方法来实现这一点。

你太接近了!您拥有所需的所有组件,只需将它们组合到一个查询中即可

考虑:

SELECT urid
     , (abs(dx - :tx) + abs(dy - :tx) + abs(dz - :tx)) AS devi
FROM visits
WHERE hash=:hashval AND devi < :nearby
ORDER BY devi
LIMIT 1
选择urid
,(abs(dx-:tx)+abs(dy-:tx)+abs(dz-:tx))作为装置
来自访问
其中hash=:hashval和devi<:附近
德维命令
限制1
逐行列出visit表中需要的行和计算值(
:tx
是占位符;在代码中,您需要准备语句,然后在执行语句之前将值绑定到占位符)

然后在
WHERE
子句中,您将返回的行限制为与特定
散列
匹配的行(该列应具有最佳结果的索引…
CREATE index visions\u idx\u hash ON visions(hash)
),并且具有小于:附近占位符值的
devi
。(我认为
devi<:nearear
:nearear>=devi
更清晰)


然后您说您希望这些结果按照
devi
的递增顺序排序,并且
将返回的结果限制为一行,因为您不关心任何其他行(如果没有符合WHERE约束的行,则不会返回任何内容)。

谢谢。你提供一个答案,然后再做一个完整的解释+1.