Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Оптимизация запроса  [new]
stsg
Member

Откуда:
Сообщений: 4
Доброго дня!
Прошу помощи в оптимизации запроса возможно в цикл.
Есть одна таблица qdfMain с полями ID, Info, Porter

ID - int
Info - Varchar
Porter - int

SELECT Info FROM qdfMain WHERE ID = <Porter> - Выводим одну запись.
SELECT Info FROM qdfMain WHERE ID = (SELECT Info FROM qdfMain WHERE ID = <Porter>) - выводим вторую запись..
SELECT Info FROM qdfMain WHERE ID = (SELECT Info FROM qdfMain WHERE ID = (SELECT Info FROM qdfMain WHERE ID = <Porter>)) - выводим третью запись...

ID Info Porter
1 Адрес1 NULL
2 Адрес2 1
3 Адрес3 2
4 Адрес4 3


Собственно это список адресов которые хранятся в одной таблице, где Porter = ID Родителя.
То бишь у первого адреса Porter не имеет значения и является пустым NULL

Если я выбрал Адрес3 то в запросе родитель у него Адрес2
Мне нужно отобразить всю цепочку адресов с выбранного до пустого "Porter"
В данный момент я организовал это так:

UPDATE tblTest SET Adres = (select Info from qdfMain where ID = <Porter>) + '-- ' + (select Info from qdfMain where ID = (select MainID from qdfMain where ID = <Porter>)) + '-- ' + (select Info from qdfMain where ID = (select MainID from qdfMain where ID = (select MainID from qdfMain where ID = <Porter>))) + '-- ' + (select Info from qdfMain where ID = (select MainID from qdfMain where ID = (select MainID from qdfMain where ID = (select MainID from qdfMain where ID = <Porter>)))) + '-- ' + (select Info from qdfMain where ID = (select MainID from qdfMain where ID = (select MainID from qdfMain where ID = (select MainID from qdfMain where ID = (select MainID from qdfMain where ID = <Porter>))))) + '-- ' + (select Info from qdfMain where ID = (select MainID from qdfMain where ID = (select MainID from qdfMain where ID = (select MainID from qdfMain where ID = (select MainID from qdfMain where ID = (select MainID from qdfMain where ID = <Porter>)))))) + '-- ' + (select Info from qdfMain where ID = (select MainID from qdfMain where ID = (select MainID from qdfMain where ID = (select MainID from qdfMain where ID = (select MainID from qdfMain where ID = (select MainID from qdfMain where ID = (select MainID from qdfMain where ID = <Porter>))))))) WHERE ID = <ID>

В запросе семь уровней подзапросов...

Это работает, если у адреса есть семь уровней вложения..
Мне бы хотелось упростить этот запрос например в цикл, чтоб он заканчивался там где Porter = NULL
19 май 17, 09:08    [20494833]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 3300
stsg,

вообщем CTE обычный, читайте пробуйте
19 май 17, 09:12    [20494850]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
aleksrov
Member

Откуда:
Сообщений: 382
stsg,

Посмотрите рекурсивный CTE.
19 май 17, 09:13    [20494852]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
aleks2
Guest
aleksrov
stsg,

Посмотрите рекурсивный CTE.


ID - int
Info - Varchar

ID = (SELECT Info

Что-то тут не так...
19 май 17, 09:18    [20494871]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
stsg
Member

Откуда:
Сообщений: 4
aleks2
aleksrov
stsg,

Посмотрите рекурсивный CTE.


ID - int
Info - Varchar

ID = (SELECT Info

Что-то тут не так...


Что не так то ? - главное, что так работает...

Вопрос в том, как оптимизировать этот запрос так, чтоб сколько б не было уровней под запросов не ручками добавлять каждый раз новый запрос... и заканчивался этот цикл должен там где ID = Porter а Porter = Null
19 май 17, 10:12    [20495102]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 21774
stsg
aleks2
пропущено...


ID - int
Info - Varchar

ID = (SELECT Info

Что-то тут не так...


Что не так то ? - главное, что так работает...

Вы разве не видите, что сначала написали одно
SELECT Info FROM qdfMain WHERE ID = (SELECT Info FROM qdfMain WHERE ID = <Porter>)

а потом другое
select Info from qdfMain where ID = (select MainID from qdfMain where ID = <Porter>)

И колонка Porter - int Вам походу привиделась :)
19 май 17, 10:17    [20495136]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 3300
stsg
aleks2
пропущено...


ID - int
Info - Varchar

ID = (SELECT Info

Что-то тут не так...


Что не так то ? - главное, что так работает...

Вопрос в том, как оптимизировать этот запрос так, чтоб сколько б не было уровней под запросов не ручками добавлять каждый раз новый запрос... и заканчивался этот цикл должен там где ID = Porter а Porter = Null

ID - int = Info - Varchar
для вас это нормально?
19 май 17, 10:18    [20495138]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 21774
stsg,

читайте про WITH обобщенное_табличное_выражение (Transact-SQL)
смотрите там примеры Г, Д, Е, Ж
19 май 17, 10:20    [20495154]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
stsg
Member

Откуда:
Сообщений: 4
TaPaK
stsg
пропущено...


Что не так то ? - главное, что так работает...

Вопрос в том, как оптимизировать этот запрос так, чтоб сколько б не было уровней под запросов не ручками добавлять каждый раз новый запрос... и заканчивался этот цикл должен там где ID = Porter а Porter = Null

ID - int = Info - Varchar
для вас это нормально?


Извиняюсь... меня немного заглючило...
на самом деле там должно быть так:
(select Info from qdfMain where ID = (select MainID from qdfMain where ID = <Porter>))
19 май 17, 10:22    [20495163]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 3300
stsg,
повторюсь, уже и ссылку дали если в гугле забанены. CTE решет задачу с деревом
19 май 17, 10:23    [20495172]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
stsg
Member

Откуда:
Сообщений: 4
stsg
TaPaK
пропущено...

ID - int = Info - Varchar
для вас это нормально?


Извиняюсь... меня немного заглючило...
на самом деле там должно быть так:
(select Info from qdfMain where ID = (select MainID from qdfMain where ID = <Porter>))


Следующий:
(select Info from qdfMain where ID = (select MainID from qdfMain where ID = (select MainID from qdfMain where ID = <Porter>)))
Следующий:
(select Info from qdfMain where ID = (select MainID from qdfMain where ID = (select MainID from qdfMain where ID = (select MainID from qdfMain where ID = <Porter>))))
и так далее..
19 май 17, 10:25    [20495182]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 387
HIERARHICAL QUERIES
MS TECHNET
19 май 17, 10:32    [20495218]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить