У меня встречный вопрос. Что значит отдать? Вернуть в Recordset? Или записать в таблицу calls? Или ещё что-нибудь? И что необходимо подставлять в кач-ве тарифа? сам тариф или его ID?
Если сохранять значения в БД, упрощается процедура обработки: сначала выбираем длины кодов в убывающем порядке, потом в цикле в запрос
программно подставляем значения длин. Сохраняем собственно сам тариф или его ID в таблицу calls только в те записи, в которых это поле равно 0 или NULL. Т.о. при обработке заполняются сначала все длинные коды, потом короче, что исключат неоднозначности как в случае с Тулой, Алексиным и Германией. Только нужно проследить чтобы во время отработки этих апдейтов в таблицу calls не добавлялись новые записи. Иначе может получиться, что во время обработки коротких кодов будет добавлен разговор с длинным частично совпадающим с коротким кодом и он будет не правильно тарифицирован.
Выборка осуществляется простым запросом к calls и вычиткой уже сохранённых значений. Т.о. процессы обработки и получения инфы можно разделить.
Если в таблице call хранить сам тариф, то удобно быстро расчитать стоимость звонка при изменении самих тарифов, но не понятно как получать инфу о направлении, т.к. ID кода не хранится. Если хранить ID, то получаем простой доступ к любой инфе о тарифе, но при его изменении (ели стоимость разговора не хранится, а вычисляется каждый раз) будут неверно перерасчитаны стоимости разговоров.
Если желаешь получить сразу все данные без предобработки, то сам запрос усложняется (пока не знаю на сколько), т.к. в выборку могут в этом случае попасть дубликаты, как в случае с Алексиным попадут и Тулькие и немецкие звонки, что плохо и надо делать ограничение.
Быть может после такого доп. вопроса и не понабится моё участие в доведении примера относительно твоих конкретных таблиц и полей
