当值来自多个表时,如何在 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
您正在使用子查询来填写 A
和 B
,这很好,但是那些子查询 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"
谢谢
我有以下 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
您正在使用子查询来填写 A
和 B
,这很好,但是那些子查询 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"
谢谢