2011-01-11 6 views
0

Я работаю над SQL Server 2005 и самым низким.В SQL как получить родительское значение по значению столбца

У меня есть структура таблицы SQL Server, как показано ниже:

ID Name  ParentID 
----------------------- 
1  Root  NULL 
2  Business 1 
3  Finance 1 
4  Stock  3 

Я хочу написать запрос, когда пользователь даст ввод ID = 1, то показать этот вывод здесь:

ID Name  ParentName 
------------------------- 
1  Root  - 
2  Business Root 
3  Finance Root 
4  Stock  Finance  

если пользователь дает ввод ID = 3, то показать этот вывод здесь:

ID Name  ParentName 
------------------------- 
3  Finance Root 
1  Root  - 
4  Stock  Finance 

Когда пользователь даст ввод ID = 4, затем показать этот вывод:

ID Name  ParentName 
------------------------- 
4  Stock  Finance  
3  Finance Root 
1  Root  - 

Заранее благодарен. Если есть запрос plz ask. спасибо за все

+2

Какова логика отображения ваших списков на основе этого идентификатора? Единственный шаблон, который я вижу, - это первый идентификатор ввода. – GONeale

+0

У меня есть две таблицы базы на родительском - отношение к ребенку должно показать подробные записи. Извините, я забыл рассказать о таблице подробностей. Надеюсь, вы поймете, почему мне нужен этот тип запроса. – shamim

+0

Как получить результат с кодом CTE – shamim

ответ

2
SELECT t1.ID, t1.Name, t2.Name AS ParentName FROM tableName t1 
LEFT JOIN tableName t2 on t1.ID = t2.ParentID 

Заменить tableName, очевидно, с таблицей. Добавить t2.ID, чтобы выбрать список, чтобы посмотреть матч, если хотите.

+0

Не фильтрует пользовательский ввод, как запрошено –

+0

Извините, это правда. Я отрегулирую, когда у меня будет больше деталей. – GONeale

+0

Пользователь не знает глубины. Если глубина - одна, тогда пользователь может легко использовать слова соединения или соединения, чтобы получить значение. Но пользователь не знает глубины. Может быть, нужно использовать рекурсивную технику. знать, как использовать рекурсивную технику на sql. – shamim

0

Эти два рекурсивных выражения CTE (Common Table Expression) выберет иерархию из заданного узла вниз в вашем дереве, а также от этого узла до дерева обратно к корню. Так как это CTE, он будет работать в SQL Server 2005 и новее - но не является в SQL Server 2000, к сожалению.

DECLARE @StartID INT 
SET @StartID = 1 

;WITH DownHierarchy AS 
(
    SELECT ID, Name, ParentID 
    FROM dbo.YourTable 
    WHERE ID = @StartID 

    UNION ALL 

    SELECT d.ID, d.Name, d.ParentID 
    FROM dbo.YourTable d 
    INNER JOIN DownHierarchy h ON d.ParentID = h.ID 
), 
UpHierarchy AS 
(
    SELECT ID, Name, ParentID 
    FROM dbo.YourTable 
    WHERE ID = @StartID 

    UNION ALL 

    SELECT d.ID, d.Name, d.ParentID 
    FROM dbo.YourTable d 
    INNER JOIN UpHierarchy h ON d.ID = h.ParentID 
) 
SELECT * 
FROM DownHierarchy 
UNION 
SELECT * 
FROM UpHierarchy 

Установка @StartID = 1 даст вам этот вывод:

ID Name ParentID 
1 Root  NULL 
2 Business 1 
3 Finance 1 
4 Stock  3 

Установка @StartID = 3 даст вам этот вывод:

ID Name  ParentID 
1 Root  NULL 
3 Finance 1 
4 Stock  3 
+0

Выполните приведенный выше синтаксис, покажите эти ошибки.Msg 156, уровень 15, состояние 1, строка 4 Неправильный синтаксис рядом с ключевым словом «WITH». Msg 137, уровень 15, состояние 2, строка 8 Должен объявить переменную '@data'. Msg 137, уровень 15, состояние 2, строка 14 Должен объявить переменную '@data'. – shamim

+0

@shamim: замените '@ data' /' dbo.YourTable' на имя вашей таблицы –

+0

После установки имени таблицы выведите следующую ошибку: Msg 156, Level 15, State 1, Line 4 Неправильный синтаксис рядом с ключевым словом 'WITH' , Msg 170, Level 15, State 1, Line 15 Строка 15: Неправильный синтаксис рядом с ','. – shamim

0

Вот модификация ответа marc_s':

Declare @data table 
(ID bigint identity(1,1) ,Name varchar(100), ParentID bigint) 

Insert into @data SELECT 'Root',NULL 
Insert into @data SELECT 'Business',1 
Insert into @data SELECT 'Finance',1 
Insert into @data SELECT 'Stock',3 


DECLARE @StartID INT 
SET @StartID = 3 

;WITH DownHierarchy AS 
(
    SELECT ID, Name, ParentID 
    FROM @data 
    WHERE ID = @StartID 

    UNION ALL 

    SELECT d.ID, d.Name, d.ParentID 
    FROM @data d 
    INNER JOIN DownHierarchy h ON d.ParentID = h.ID 
), 
UpHierarchy AS 
(
    SELECT ID, Name, ParentID 
    FROM @data 
    WHERE ID = @StartID 

    UNION ALL 

    SELECT d.ID, d.Name, d.ParentID 
    FROM @data d 
    INNER JOIN UpHierarchy h ON d.ID = h.ParentID 
) 
SELECT * 
FROM DownHierarchy 
UNION 
SELECT * 
FROM UpHierarchy 
0

У меня есть подобный ответ - но построив его, я хочу, чтобы разместить его;)

declare @Data table (
    ID int not null, 
    Name varchar(50) not null, 
    ParentID int null 
); 

insert into @Data 
select 1, 'Root', null 
union select 2, 'Business', 1 
union select 3, 'Finance', 1 
union select 4, 'Stock', 3; 

declare @UserInput int; 
set @UserInput = 4; 

with cParents as (
    select d.ID, d.Name, d.ParentID 
    from @Data d 
    where d.ID = @UserInput 
    union all 
    select d.ID, d.Name, d.ParentID 
    from cParents c 
    inner join @Data d 
     on d.ID = c.ParentID 
), 
cChildren as (
    select d.ID, d.Name, d.ParentID 
    from @Data d 
    where d.ID = @UserInput 
    union all 
    select d.ID, d.Name, d.ParentID 
    from cChildren c 
    inner join @Data d 
     on d.ParentID = c.ID 
) 
select RecordType='self', d.ID, d.Name, ParentName=isnull(p.Name,'') 
from @Data d 
left join @Data p 
    on p.ID = d.ParentID 
where d.ID = @UserInput 

union all 

select RecordType='parents', d.ID, d.Name, ParentName=isnull(p.Name,'') 
from cParents d 
left join @Data p 
    on p.ID = d.ParentID 
where d.ID <> @UserInput 

union all 

select RecordType='children', d.ID, d.Name, ParentName=isnull(p.Name,'') 
from cChildren d 
left join @Data p 
    on p.ID = d.ParentID 
where d.ID <> @UserInput; 

@data представляют выборочные данные, @UserInput является входным переменным. Я добавил RecordType, чтобы прояснить смысл частей записи. Он протестирован на SQL Server 2008 и должен работать в 2005 году, но не в 2000 году.

+0

Msg 156, уровень 15, состояние 1, процедура spGetParent, строка 8 Неверный синтаксис рядом с ключевым словом «WITH». Msg 170, уровень 15, состояние 1, процедура spGetParent, строка 20 Строка 20: неправильный синтаксис рядом с ','. – shamim

Смежные вопросы