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

How do you use WHERE BETWEEN clause in SQLite, when the values come from multiple tables?

我有以下 tables(包括完整架构,但只需要 TIME 值:

"POINTS" TABLE

     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"

"AUDIO" TABLE

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 table 中找到每条记录,这些记录的 TSTAMP 位于 AUDIO table 的任何 START / STOP 对之间。

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

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

Which returns 0。我知道这些数据是对齐的,如果有正确的搜索语句,我应该会返回多条记录。但是,我似乎找不到任何关于如何在一个搜索语句中解决从多个 table 中提取列的参考。

我知道我可以在 Python 中把它放在一起,但对于 SQL 来说这似乎是一般的正常工作。

还在习惯 SQL,所以请明确回答。 谢谢

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

BETWEEN A AND B

您正在使用子查询来填写 AB,这很好,但是那些子查询 return 超过 1 个值,这就是您的问题所在。

SELECT START FROM AUDIO

会 return:

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

在这种情况下,Between 试图找出 "between these 3 dates and these other dates"。没有意义。您需要确保在子查询中只返回 1 个结果。

除此之外,您对 TSTAMP BETWEEN A AND B 的用法并没有错。

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

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

这将为每个匹配项 return 一行。要删除重复文件,请使用 DISTINCT。

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

select 停止,停止, (select GROUP_CONCAT(POINTS.FILE) 来自 POINTS where datetime(POINTS.TSTAMP) between datetime(AUDIO.STA) and datetime(AUDIO.STOP) ) 作为 FIL 来自音频 来自音频

这将 return 将出现在 range.Also 中的逗号分隔数据列表 我使用以下数据来检查

AUDIO
    STA                        STOP  
"2015-12-15T22:37:00"   "2015-12-15T22:39:53"
"2015-12-15T22:27:00"   "2015-12-15T22:37:00"
"2015-12-15T22:17:00"   "2015-12-15T22:27:00"

POINTS
     TSTAMP                 FILE 
"2015-12-15T22:29:54"   "L151400.GPS"
"2015-12-15T22:29:55"   "L151400.GPS"
"2015-12-15T22:29:56"   "L151400.GPS"

And following is the result
   STA                      STOP              FIL                       
"2015-12-15T22:37:00" "2015-12-15T22:39:53" "NULL"

"2015-12-15T22:27:00" "2015-12-15T22:37:00" "L151400.GPS,L151400.GPS,L151400.GPS"

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

谢谢