У меня есть таблица с очень простой схемой:
CREATE TABLE q(
orig INTEGER NOT NULL,
dest INTEGER NOT NULL,
cost FLOAT,
PRIMARY KEY (orig, dest)
);
Мне нужно пройтись по столу назад, чтобы минимизировать затраты. Позвольте мне объяснить.
Мне нужен тур из 15 пунктов, пункт может быть orig
или dest
. Мой алгоритм - возврат от последнего dest
к исходному orig
. Вот как я это изложил:
Учитывая последний dest
, найдите orig
, который будет ссылаться на указанный dest
с минимальным cost
. Соответствующий orig
становится новым dest
; повторить это 15 раз.
Давайте предположим, что я знаю, что последним dest
является число 10
. Оператор SQL, который позволяет мне найти orig
, ведущий к dest
в cost-
, сводит к минимуму:
SELECT orig FROM q WHERE cost = (SELECT MIN(cost) FROM q WHERE dest = 10);
Теперь я бы использовал orig
, возвращенный вышеупомянутой функцией, чтобы найти предыдущую точку (предположим, она вернула, скажем, точку 5
):
SELECT orig FROM q WHERE cost = (SELECT MIN(cost) FROM q WHERE dest = 5);
Я могу продолжать до тех пор, пока не наберу 15 очков.
Как сделать эффективный запрос, чтобы сделать это в SQL? В моей таблице 50 миллионов строк.