Как получить 3 уровня вложенных записей одним SQL запросом?
Есть таблица Accounts с полями Id, Name, ParentId и CompanyId. ParentId может равняться NULL. В этом случае аккаунт является аккаунтом первого уровня. Соответственно аккаунт может быть также второго и третьего уровня. В некоторых аккаунтов может не быть аккаунтов второго или третьего уровня. То есть структура записей может выглядеть так:
Как можно получить 3 уровня вложенных записей одним SQL запросом для заданного CompanyId? Скорее всего нужно сделать 2 раза JOIN самой таблицы Accounts. Но как правильно это записать?
SELECT * FROM :table WHERE
company_id = :company_id
OR parent_id = (
SELECT id FROM :table WHERE company_id = :company_id)
OR parent_id IN (
SELECT id FROM :table WHERE parent_id = (
SELECT id FROM :table WHERE company_id = :company_id))
Дело в том, что записей может быть много и для них могут быть дополнительные условия. То есть, например, получить только одну ветку - Account 1 со всеми 3-мя уровнями. Тогда все записи брать неэффективно.
Да. Но также не исключается вариант формирования дерева в самом коде программы. То есть хочу получить все записи дерева небольшим количеством запросов (желательно одним).