У меня есть два стола, Foo и Bar. Foo содержит внешний ключ к первичному ключу Bar (bar_id). Bar структурирован так, чтобы разрешить отношения родитель / потомок к себе через внешний ключ (bar_parent_id) к другой записи в Bar. Это отношение ограничено, так что любая запись Bar, у которой есть родитель, сама не может быть родительской. Однако у любого данного родителя может быть несколько детей.
В моем запросе необходимо выбрать все записи в Foo, которые соответствуют заданной записи в Bar, а также любых родителей, детей или братьев Bar. Запрос ниже работает, но несколько медленно. Есть ли способ структурировать его так, чтобы он работал быстрее?
SELECT f.field1, f.field2
FROM Foo f
WHERE f.bar_id IN (
SELECT bar_id
FROM Bar
WHERE bar_id = @bar_id OR
bar_parent_id = @bar_id OR
bar_id = (SELECT bar_parent_id FROM Bar WHERE bar_id = @bar_id) OR
bar_parent_id = (SELECT bar_parent_id FROM Bar WHERE bar_id = @bar_id AND bar_parent_id > 0)
)
P.S. Это упрощенная версия реального запроса. На самом деле у него есть второй, идентичный подзапросу к другой таблице, которая имеет те же отношения self / parent / child, что и Bar.