Как я могу выполнить рекурсивный выбор из той же таблицы в SQL?

#sql #sql-server #tsql #hierarchical-data #recursive-query

#sql #sql-server #tsql #иерархический-данные #рекурсивный запрос

Вопрос:

У меня есть таблица со следующим

 Table1:

ObjectName  Field           Type      Link

Account     Name            String          
Asset       AccountId       Guid      Account       
Asset       Name            String          
Account     BillingStreet   String    Details       
Details     FirstName       String    Order
Order       OrderNo         Integer  
Order       OrderItem       String      
  

Основной точкой отсчета является ресурс. под этим я подразумеваю, что я могу выполнить выбор * из Таблицы1, где objectName = ‘Asset’. Это дало бы мне 2 строки.
Но есть ссылка на учетную запись Asset ie.
Итак, если есть ссылка на выбор выше, выберите все строки с этим именем

Итак, что-то вроде:

выберите * из Asset , если в столбце Link есть значение , затем выберите все строки, в которых есть objectName имени ссылки, и продолжайте, пока больше не останется. Таким образом, он завершится, когда он выберет порядок
, потому что в заказе нет ссылки

Если бы я должен был выполнить выбор * из Table1, где objectName = ‘Account’, то, поскольку в одной из строк есть ссылка, мне нужно было бы выбрать строку Details, и, в свою очередь, details имеет ссылку на Order, и мне нужно выбрать Order, и поскольку Order не имеет Linhk , вот и все

Как я могу выполнить этот сложный запрос в sql, не зная, с чего начать?

Как я могу выполнить этот сложный запрос в sql?

Комментарии:

1. Пожалуйста, укажите в своем вопросе базу данных, которую вы используете: mysql, oracle, sqlserver …?

Ответ №1:

Вы описываете иерархический запрос. Синтаксис немного отличается в разных базах данных (и не все базы данных реализуют эту функцию), но идея в том,:

 with recursive cte (objectname, field, type, link) as (
    select t.* from table1 t where objectname = 'Asset'
    union all
    select t.*
    from table1 t
    inner join cte c on c.link = t.objectname
)
select * from cte
  

Комментарии:

1. Я получаю сообщение об ошибке: сообщение 102, уровень 15, состояние 1, строка 11 Неправильный синтаксис рядом с ‘recursive’.

2. @Debbie.S: итак, вы используете SQL Server. Просто удалите recursive ключевое слово, и запрос должен сработать.