当值来自多个表时,如何在SQLite中使用WHERE BETWEEN子句?

时间:2015-12-16 05:34:54

标签: sqlite where-clause

我有以下表格(包括完整模式,但只需要TIME值:

“POINTS”表

     TSTAMP,                 LAT,   LON,     HDOP,    ALT,     FILE,        EUID
    "2015-12-15T20:29:54"   "0.0"   "0.0"   "99.99" "NULL"  "L151400.GPS"   "080D55"
    "2015-12-15T20:29:55"   "0.0"   "0.0"   "99.99" "NULL"  "L151400.GPS"   "080D55"
    "2015-12-15T20:29:56"   "0.0"   "0.0"   "99.99" "NULL"  "L151400.GPS"   "080D55"

“音频”表

START,                  STOP,                    NCHANNELS,     SAMPWIDTH,  FRAMERATE, NFRAMES, COMPTYPE, COMPNAME, FILE, FILESIZE, EUID
"2015-12-15T22:37:00"   "2015-12-15T22:39:53"   "1.0"   "2.0"   "16000.0"   "2777088.0" "NONE"  "not compressed"    "static/uploads/WAV/L151637.WAV"    "5554688.0"
"2015-12-15T22:27:00"   "2015-12-15T22:37:00"   "1.0"   "2.0"   "16000.0"   "9601024.0" "NONE"  "not compressed"    "static/uploads/WAV/L151627.WAV"    "19202560.0"
"2015-12-15T22:17:00"   "2015-12-15T22:27:00"   "1.0"   "2.0"   "16000.0"   "9601024.0" "NONE"  "not compressed"    "static/uploads/WAV/L151617.WAV"    "19202560.0"

我需要找到POINTS表中的每个记录,其中TSTAMP位于AUDIO表的任何START / STOP对之间。

到目前为止,我已经尝试了以下迭代:

SELECT FILE FROM POINTS 
WHERE (
TSTAMP
BETWEEN (SELECT START FROM AUDIO) AND 
(SELECT STOP FROM AUDIO)
);

返回0.我知道这些数据排成一行,如果给出正确的搜索语句,我应该返回多条记录。但是,我似乎找不到任何关于如何在一个搜索语句中解决从多个表中提取列的引用。

我知道我可以在Python中将它们整合在一起,但对于SQL来说这似乎是一个正常的工作。

仍然习惯于SQL,所以请在答案中明确说明。 感谢

3 个答案:

答案 0 :(得分:1)

要匹配可能有多个匹配的行,请使用连接:

SELECT Points.File
FROM Points
JOIN Audio ON Points.TStamp BETWEEN Audio.Start AND Audio.Stop;

这将为每场比赛返回一行。要删除重复文件,请使用DISTINCT。

答案 1 :(得分:1)

查找POINTS表中具有TSTAMP的每条记录,该记录位于AUDIO表的任何START / STOP对之间。你可以使用以下查询。另外请不要使用 start 作为列名,这是sqlite中的关键字。我用 sta 你可以更改列名。

选择STA,STOP, (从POINTS中选择GROUP_CONCAT(POINTS.FILE),其中datetime(AUDIO.STA)和datetime(AUDIO.STOP)之间的datetime(POINTS.TSTAMP))为FIL  来自音频  来自音频

这将返回以逗号分隔的数据列表,这些数据将在范围内发生。我也使用以下数据来检查

 [
  {
   "id": "75318408571184",
   "component": "textInput",
   "index": 0,
   "label": "Text",
   "description": "description",
   "placeholder": "placeholder",
   "value": "value1"
   },
  {
  "id": "9463537670672",
  "component": "textArea",
  "index": 1,
  "label": "Paragraph",
  "description": "description",
  "placeholder": "placeholder",
   "value": "value2"
  }

谢谢

答案 2 :(得分:-1)

Between假设与两个值一起使用,如:

BETWEEN A AND B

您正在使用子查询来填写AB,这很好,但这些子查询会返回超过1个值以及您的问题所在的位置。

SELECT START FROM AUDIO

将返回:

"2015-12-15T22:37:00"
"2015-12-15T22:27:00"
"2015-12-15T22:17:00"

在这种情况下,Between正试图找出这3个日期与其他日期之间的关系#34;没有意义。您需要确保只在子查询中获得1个结果。

除此之外,您对TSTAMP BETWEEN A AND B的使用并不错误。