сражаясь с INNER JOIN / UNKNOWN COLUMN, пытаясь избежать повторного вызова сохраненных функций - PullRequest
0 голосов
/ 08 февраля 2012
SELECT A.Id, B.Id, lat_long_km(A.longitude,A.latitude,B.longitude,B.latitude) AS instance_distance_km
FROM local_db.entity A
INNER JOIN local_db.entity B
ON A.Id < B.Id
INNER JOIN local_db.type_link tcl
ON
(
# check types are in link table
(A.type_id <= B.type_id AND A.type_id = tcl.type_id_A AND B.type_id = tcl.type_id_B)
OR
(A.type_id > B.type_id AND B.type_id = tcl.type_id_A AND A.type_id = tcl.type_id_B)
)
INNER JOIN local_db.type_range_info trange
ON
(
# get the range for the type
(A.type_id <= B.type_id AND A.type_id = trange.type_id)
OR
(A.type_id > B.type_id AND B.type_id = trange.type_id)
)
WHERE
lat_long_km(A.longitude,A.latitude,B.longitude,B.latitude) < trange.range_km;

Таблицы и их важные поля:

entity - Id, longtitude, latitude, type_id
type_link - type_id_A, type_id_B
type_range_info - type_id, range_km

Работает очень медленно из-за повторного вызова lat_long_km (), но если я заменю заключительное предложение WHERE на instance_distance_km

Я не могу найти способ устранить двойной вызов хранимой функции, например, путем сохранения результата. Эточасть INSERT, поэтому должна быть в одном запросе. Любые идеи?

Предыстория:

Я хочу найти объекты определенных типов на определенных расстояниях друг от друга. Я использую таблицу type_link дляхранить, какие типы следует сравнивать (сохраняя пары type_ids) и type_range_info для хранения того, каким должен быть диапазон между определенными типами в км.

Я написал хранимую функцию lat_long_km (A.longitude, A.latitude,B.longitude, B.latitude), которое возвращает расстояние в км между двумя точками и использует приведенное ниже утверждение, чтобы найти все объекты, которые связаны и находятся в правильном диапазоне.

...