如何选择一个查询中的列不在其他查询的列之间的记录?

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 的 timeFromtimeTo 之间

    如何组合这两个查询?什么是最有效的方法?

    我认为从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

【讨论】:

以上是关于如何选择一个查询中的列不在其他查询的列之间的记录?的主要内容,如果未能解决你的问题,请参考以下文章

选择查询用于从内部查询的这些记录中选择列。其中内部查询和外部查询具有不同的列

如何使用 JPA 原生查询选择多个同名的列?

JPA 查询对不在查询中的列抛出“未找到”错误

过滤不在选择中的列值

在 SQL 中选择不在 Group By 中的列

Spring Data 以及如何按不在实体中的列进行排序