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

Откуда:
Сообщений: 17
Прощу помогите умные люди.
Кто знает как можно сделать следущую вещь
Есть таблица (ParentTierID, TierID)
Мне нужно выбрать по TierID все записи из этой таблице поднимаясь верх пока parentTierID не станет меньше 1010

Например
ParentTierID, TierID
1000 1012
1012 1024
1024 1253

т.е. теперь при вызове этого select ему передаётся 1253, и он должен вернуть, как 1253 так и 1024, но не должен возвращать 1012
23 дек 14, 13:29    [17039607]     Ответить | Цитировать Сообщить модератору
 Re: SQL, рекурсия или что мне поможет?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21253
Ну собсно составить рекурсивный запрос (RTFM CTE) и написать соотв. условие отбора во WHERE.
http://msdn.microsoft.com/ru-ru/library/ms175972.aspx
23 дек 14, 13:53    [17039794]     Ответить | Цитировать Сообщить модератору
 Re: SQL, рекурсия или что мне поможет?  [new]
хмхмхм
Guest
Verbal,

CTE Вам в помощь:
http://msdn.microsoft.com/ru-ru/library/ms175972.aspx
23 дек 14, 14:01    [17039855]     Ответить | Цитировать Сообщить модератору
 Re: SQL, рекурсия или что мне поможет?  [new]
Verbal
Member

Откуда:
Сообщений: 17
написал следующем образом но не работает :(

USE [Xplode_Content_GlobalEdge]
GO
WITH TiersReports(TiersID) AS
(
SELECT TierID
FROM Tiers
WHERE TierID IS NULL
UNION ALL
SELECT Tiers.TierID
FROM Tiers AS e
INNER JOIN Tiers AS d
ON d.ParentTierID = e.TierID
)
SELECT *
FROM TiersReports
GO

я не могу понять вот эту часть
SELECT Tiers.TierID
FROM Tiers AS e
INNER JOIN Tiers AS d
ON d.ParentTierID = e.TierID
в примере две таблице, а если одна, тогда как нужно оформить его?
23 дек 14, 14:11    [17039959]     Ответить | Цитировать Сообщить модератору
 Re: SQL, рекурсия или что мне поможет?  [new]
Verbal
Member

Откуда:
Сообщений: 17
я разобрался как сделать что бы работала
USE [Xplode_Content_GlobalEdge]
GO
WITH TiersReports(TiersID) AS
(
SELECT TierID
FROM Tiers
WHERE TierID IS NULL
UNION ALL
SELECT t1.TierID
FROM Tiers AS t1
INNER JOIN Tiers AS t2
ON t1.ParentTierID = t2.TierID
)
SELECT *
FROM TiersReports
GO

теперь только осталось здесь что бы по определённому TierID выбирала. может подскажет кто где нужно поставить правильный where?
23 дек 14, 14:17    [17040009]     Ответить | Цитировать Сообщить модератору
 Re: SQL, рекурсия или что мне поможет?  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Verbal
я разобрался как сделать что бы работала
USE [Xplode_Content_GlobalEdge]
GO
WITH TiersReports(TiersID) AS
(
SELECT TierID
FROM Tiers
WHERE TierID IS NULL
UNION ALL
SELECT t1.TierID
FROM Tiers AS t1
INNER JOIN Tiers AS t2
ON t1.ParentTierID = t2.TierID
)
SELECT *
FROM TiersReports
GO

теперь только осталось здесь что бы по определённому TierID выбирала. может подскажет кто где нужно поставить правильный where?
И где же здесь обращение к имени CTE внутри CTE?
Это не рекурсия!
23 дек 14, 14:21    [17040062]     Ответить | Цитировать Сообщить модератору
 Re: SQL, рекурсия или что мне поможет?  [new]
Verbal
Member

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

вот
USE [Xplode_Content_GlobalEdge]
GO
WITH TiersReports(TiersID) AS
(
SELECT TierID
FROM Tiers
WHERE TierID = '2502'
UNION ALL
SELECT t1.TierID
FROM Tiers AS t1
INNER JOIN TiersReports AS t2
ON t2.TiersID = t1.ParentTierID
)
SELECT *
FROM TiersReports
GO

только не могу сделать что бы в обратную сторону шёл
у меня есть записи
1024 и 2502

если я ввожу 1024 он вывыдет 1024 и 2502, однако если 2502 он выводит только 2502, а мне надо наоборот:(
23 дек 14, 14:26    [17040119]     Ответить | Цитировать Сообщить модератору
 Re: SQL, рекурсия или что мне поможет?  [new]
Verbal
Member

Откуда:
Сообщений: 17
Ура сделал, вот правильный ответ кому нужно

USE [Xplode_Content_GlobalEdge]
GO
WITH TiersReports(TierID, ParentTierID) AS
(
SELECT TierID,ParentTierID
FROM Tiers
WHERE TierID = '2502'
UNION ALL
SELECT t1.TierID,t1.ParentTierID
FROM Tiers AS t1
INNER JOIN TiersReports AS t2
ON t2.ParentTierID = t1.TierID
)
SELECT *
FROM TiersReports
GO
23 дек 14, 14:36    [17040243]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить