#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
ключевое слово, и запрос должен сработать.