如何选择一个查询中的列不在其他查询的列之间的记录?
Posted
技术标签:
【中文标题】如何选择一个查询中的列不在其他查询的列之间的记录?【英文标题】:How to select records whose column from one query is NOT between columns of other query? 【发布时间】:2014-07-12 14:11:45 【问题描述】:我需要从 QUERY1 获取记录,其 time
介于 QUERY2 的 timeFrom
和 timeTo
之间
如何组合这两个查询?什么是最有效的方法?
我认为从t1
中选择记录会更有效,其time
介于timeFrom
和来自QUERY2 的timeTo
之间,然后才将其与t2
连接起来,对吧?
如果是,我如何使用一个查询来完成?
注意
: 表 t1
有大约 200 万条记录!
QUERY1
SELECT ..., time
FROM t1, t2
WHERE t1.time >= t2.starttime
QUERY2
SELECT timeFrom, timeTto
FROM (...) t3 RIGHT JOIN
(...) t4 ON t3.rownum = t4.rownum
【问题讨论】:
@AmitChotaliya,你有没有看到我的问题和我的帖子,或者你只是根据主题回答,甚至没有阅读我写的内容?:) 【参考方案1】:做一个三向连接:
SELECT ...
FROM t1
JOIN t2 ON t1.time >= t2.starttime
JOIN (SELECT timeFrom, timeTo
FROM (...) t3
RIGHT JOIN (...) t4 ON t3.rownum = t4.rownum) t5
ON t1.time BETWEEN t5.timeFrom AND t5.timeTo
让查询调度程序找出执行连接的顺序。但是如果这不起作用,您可以尝试通过重新排序到子查询来帮助它:
SELECT ...
FROM (SELECT t1.*
FROM t1
JOIN (SELECT timeFrom, timeTo
FROM (...) t3
RIGHT JOIN (...) t4 ON t3.rownum = t4.rownum) t5
ON t1.time BETWEEN t5.timeFrom AND t5.timeTo) t1
JOIN t2 ON t1.time >= t2.starttime
另外,请确保您在t1.time
上有一个索引。
对于NOT BETWEEN
,需要使用外连接或者不存在查询:
SELECT id, time
FROM myTable t
LEFT JOIN filterTable ft ON t.time BETWEEN ft.fromTime AND ft.toTime
WHERE ft.fromTime IS NULL
SELECT id, time
FROM myTable t
WHERE NOT EXISTS (SELECT * FROM filterTable
WHERE t.time BETWEEN fromTime AND toTime)
这类似于您必须使用的查询来查找表中的行,而这些行在另一个表中没有匹配的行。唯一的区别是条件是BETWEEN
而不是=
。
DEMO
【讨论】:
以上是关于如何选择一个查询中的列不在其他查询的列之间的记录?的主要内容,如果未能解决你的问题,请参考以下文章