将子句转换为连接

时间:2013-12-26 14:57:40

标签: mysql sql oracle db2 postgresql-9.1

需要对可以在mysql,postgres和其他主要数据库上运行的连接进行通用sql查询

我有一张名为autumn4.ip的表,我有three columns: id,start,end (all ints).

如何进行连接,以便我不是使用BETWEEN而是使用JOINS。

喜欢伪:

select * FROM autumn.ip WHERE :number-constant >= start ORDER BY start DESC LIMIT 1; +

select * FROM autumn.ip WHERE :number-constant <= end ORDER BY start ASC LIMIT 1;

如何将某些人加入上述两个查询以获得一行等同于

的数据
SELECT * FROM autumn4.ip WHERE :number-constant BETWEEN START AND END LIMIT 1;

不要问我为什么这样做:) 但我知道你这么做:

我想要完成的是使用2个索引,开始和结束。如果我使用BETWEEN和/或start,end的复合索引。仅使用启动索引而不是结束。现在请不要告诉我,我错了。我只想这样。我已经对此做了很多研究

如果我为开始和结束创建单个索引,则只使用一个。给我一个查询,其中两个都使用

2 个答案:

答案 0 :(得分:0)

您希望请求仅选择开始和结束之间的第一行,使用JOIN?

编辑:

  

忘了我的回答!对于我的想法,不需要2张桌子!它更像是指数问题而不是其他任何东西......

你可以尝试在START上放一个索引,在END上放一个不同的索引(看起来你的两个列都有1个索引,不是吗?),然后像你这样选择:

SELECT * FROM autumn4.ip WHERE :number >= START AND :number <= END ORDER BY START LIMIT 1; 

(or ORDER BY START DESC if you want the biggest start) .

答案 1 :(得分:0)

您在MySQL中听到的范围扫描和between根本就不是这样。以下是documentation

的引用
  

B树索引特征

     

B树索引可用于表达式中的列比较   使用=,&gt;,&gt; =,&lt;,&lt; =或BETWEEN运算符。该指数也可以   如果LIKE的参数是常量字符串,则用于LIKE比较   不以通配符开头。

因此,使用索引并不令人惊讶。此数据的最佳索引是start, end上的综合索引。

您遇到的问题是您有两列startend。这使查询更复杂。

以下情况可能会在某些情况下表现更好,start上的索引和end上的单独索引以及行上的主键:

select gt.*
from (SELECT * FROM autumn4.ip WHERE :number >= start) gt join 
     (SELECT * FROM autumn4.ip WHERE :number <= end) lt
     on gt.PRIMARYKEY = lt.PRIMARYKEY;
相关问题