我需要一个可以在mysql,postgres和其他主要数据库上运行的连接的通用SQL查询。
我有一个名为autumn4.ip
的表格,其中有三列:id, start, end
(所有整数)。
如何进行连接以便我不是通过BETWEEN而是通过JOIN来使用BUT?
喜欢(伪):
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;
我正在尝试在start
和end
上使用2个索引。如果我在(start, end)
上使用BETWEEN和/或复合索引,则仅使用start index而不是end。现在请不要告诉我,我错了。我只想这样。我对此做了很多研究。
如果我为start和end创建单个索引,则只使用一个。我正在寻找一个使用两者的查询。
答案 0 :(得分:0)
诀窍是以 DESCENDING
顺序在复合索引中添加第二列。
使用基本的b-tree索引,这将在 PostgreSQL 中使用(如果满足一些一般先决条件):
CREATE INDEX foo ON autumn.ip (col_start, col_end DESC)
一般主体应该适用于任何具有b-tree索引的RDBMS。
此外,对于像你这样的范围查询,GiST索引在PostgreSQL中可能更有效。考虑这个密切相关的答案:
PostgreSQL index not used for query on range
除此之外:从不使用start
end
或{{1}}作为标识符,尤其是在您尝试与多个RDBMS保持兼容的情况下。
答案 1 :(得分:0)
一个简单的
SELECT * FROM autumn.ip WHERE :number-constant >= start
ORDER BY start DESC LIMIT 1
UNION
SELECT * FROM autumn.ip WHERE :number-constant <= end
ORDER BY start ASC LIMIT 1;
应该有用。
但是,让我质疑你的研究质量......