在SQL中有效地获取数字列表中的最接近值

时间:2015-07-13 13:43:56

标签: sql sqlite

我将是第一个承认我几乎不了解SQL的人,所以我知道这可能是我尝试做的更好的方式,这就是我在这里的原因。我有一个数字列表,我正在尝试获取数据库中的条目,该条目最接近(小于或等于)该数字,对于列表中的每个数字。我知道,例如,如果我有一个数字列表,并且我试图找到列等于这些值的条目,那就像是:

SELECT valueA, valueB, valueC 
    FROM TableA 
    WHERE valueC in (num1, num2, num3, num4...);

但是,我不确定如何或是否可以组合使用lte运算符。所以,我目前正在做的是列表中每个值的SELECT语句,如下所示:

SELECT valueA, valueB, valueC
    FROM TableA
    WHERE valueC <= num1
    ORDER BY valueC DESC LIMIT 1;

当我的列表的大小很小时哪个工作正常,但是当它相当大时,即几百万的大小时,这需要非常非常长的时间才能完成,因为每个列表项都需要它自己的SQL调用。

有没有更好的方法来做到这一点,或者,如果我仍然需要调用每个列表项,更有效的方法是获得小于或等于列表项的最大值而不排序结果列出并获得第一个?

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是更改​​IN子句,因为您说<=喜欢

SELECT valueA, valueB, valueC
    FROM TableA
    WHERE (num1, num2, num3, num4...) IN valueC
    ORDER BY valueC DESC LIMIT 1;

另一种方法是将此列表值填充在临时表中,如

create temporary table tbl1(col int);
insert into tbl1
values(num1, num2, num3, num4...);

执行您的查询,如

SELECT valueA, valueB, valueC
    FROM TableA ta
    WHERE EXISTS (SELECT 1 FROM tbl1 WHERE col <= ta.valueC)
    ORDER BY valueC DESC LIMIT 1;

答案 1 :(得分:-1)

如果括号中的列表按升序排序,您可以尝试以下

SELECT valueA, valueB, valueC
FROM TableA
WHERE valueC <= ANY (num1, num2, num3 ...);

但是我不知道SQLite是否支持ANY子句。

对于单个值C,只要在列表中找到小于或等于的值,查询就会停止列表评估。