Как я могу получить родителей всех родителей в качестве столбцов для дочернего объекта в таблице с круговыми ссылками?

У меня есть таблица со столбцами вроде

entityID, entityName, parentID 

Как я могу написать запрос, чтобы вернуть все уровни родителей для объекта, чтобы вернуть что-то вроде

 childentityname, parentlevel1name, parentlevel2name, parentLevel3name and so on 

Я никоим образом не являюсь ниндзя SQL. Это возможно? Если да, то как?

Я использую БД SQL Server.

    Рекурсивный CTE – это то, что вам нужно посмотреть здесь (EDIT: Только в SQL SERVER 2005+)

    Что-то вроде:

     WITH recurse_cte (entityID,entityName, parentID, Level) AS ( -- Anchor member definition SELECT e.entityID,e.entityName, e.parentID, 0 AS Level FROM self_joined AS e UNION ALL -- Recursive member definition SELECT e.entityID,e.entityName, e.parentID, Level + 1 FROM self_joined AS e INNER JOIN recurse_cte AS cte ON e.entityID = cte.parentID ) select * from recurse_cte 

    В postgres это именно то, для чего WITH RECURSIVE . Вероятно, вам не нужно делать гораздо больше, чем изменять имена столбцов из документации ( связанного здесь ).

    Я не знаю, поддерживает ли DB OP рекурсивный, вероятно, зависит от номера версии. Если доступно, синтаксис будет похож или идентичен. Если нет, это большая неприятность. Очень сложно сделать чистое SQL-решение, особенно если количество уровней неограничено.

     SELECT 'accounts'.'id' AS id_0, 'accounts'.'child_id' AS child_id_0, 'child_accounts_1'.'id' AS id_1, 'child_accounts_1'.'child_id' AS child_id_1, 'child_accounts_2'.'id' AS id_2, 'child_accounts_2'.'child_id' AS child_id_2, 'child_accounts_3'.'id' AS id_3, 'child_accounts_3'.'child_id' AS child_id_3, 'child_accounts_4'.'id' AS id_4, 'child_accounts_4'.'child_id' AS child_id_4 FROM 'accounts' LEFT OUTER JOIN 'accounts' 'child_accounts_1' ON 'child_accounts_1'.'id' = 'accounts'.'child_id' LEFT OUTER JOIN 'accounts' 'child_accounts_2' ON 'child_accounts_2'.'id' = 'child_accounts_1'.'child_id' LEFT OUTER JOIN 'accounts' 'child_accounts_3' ON 'child_accounts_3'.'id' = 'child_accounts_2'.'child_id' LEFT OUTER JOIN 'accounts' 'child_accounts_4' ON 'child_accounts_4'.'id' = 'child_accounts_3'.'child_id' WHERE 'accounts'.'id' = 56 

    Это очень похоже на то, что вы делаете, кроме моего – это иерархия детей.

    Таблица accounts имеет атрибут negative_overflow_account_id который ссылается на себя. Здесь вы получите «id» и «negative_overflow_id» из первых 5 слоев вложенности.

    Я написал в своем коде цикл, который будет генерировать этот запрос на основе константы MAX_OVERFLOW, которая будет генерировать это при установке «5», и будет делать больше / меньше, если используется другое число.

    В основном мой случай использования состоял в том, чтобы убедиться, что кто-то не устанавливает бесконечно круговую петлю, поэтому, если он достигает уровня 5, тогда пользователю приходит ошибка, говорящая им, что они не могут установить ее настолько глубоко. И если какой-либо из уровней ссылается на верхний уровень или на один из предыдущих уровней, тогда также генерируется ошибка, указывающая на циклическую рекурсию (что может привести к сбою приложения позже, если разрешено продолжать).

    EDIT: Я сократил имена. никто не хочет видеть мою тупую смешную конвенцию об именах для этого тупого стола;)