Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2015, 17:28   #1
Yoh
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 37
По умолчанию Составной запрос из одной таблицы

Добрый день. Есть таблица, в которой есть id, somevalue, parentId. Как составить запрос, чтобы получить somevalue у папы и деда? Дело происходит в Microsoft SQL Server Management studio. делаю что то вроде
Код:
SELECT p1.[Id]
      ,p2.[someValue]
      ,p3.[someValue]
  FROM [dbo].[SomeTable] as p1, [dbo].[SomeTable] as p2, [dbo].[SomeTable] as p3
  where p1.id='99999999' 
and p2.[someValue]=(SELECT [someValue]  FROM [dbo].[SomeTable]  where p2.id=p1.ParentId)
and p3.[someValue]=(SELECT [someValue]  FROM [dbo].[SomeTable]  where p3.id=p2.ParentId)
Но он ругается, что получается больше одного значения. Я подозреваю, что во вложенных запросах он не знает про ParentId. Как решать такую задачу?
Yoh вне форума Ответить с цитированием
Старый 23.03.2015, 17:36   #2
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

cte + рекурсия, ограничивая левелом, вроде должно получиться
что-то как-то так
Код:
with rows as (
select 3 as level, * from [dbo].[SomeTable] where id='99999999' 

union all 

select rows.level - 1, * from [dbo].[SomeTable] sv
join rows on sv.id=rows.parentid
where rows.level > 0
)
select * from rows
..... не проверял

Последний раз редактировалось lomastr_; 23.03.2015 в 17:45.
lomastr_ вне форума Ответить с цитированием
Старый 23.03.2015, 18:22   #3
Yoh
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 37
По умолчанию

Спасибо большое, уже что то выдает) Сделал вот так
Код:
USE [my.database]
GO
	with rows as (
	select 3 as level, id, somevalue , parentid from [dbo].[SomeTable] where id='999999' 

	union all 

	select rows.level - 1, sv.id,sv.someValue, sv.parentid from [dbo].[SomeTable] sv
	join rows on sv.id=rows.parentid
	where rows.level > 0
	)
	select * from rows
GO
Я, к сожалению, в sql плохо разбираюсь( Есть ли возможность как то хитро объединить полученые поля в одну строчку? Как бэ то что есть результат уже хорошо, но хотелось бы для красоты объединить в одну о_о
Yoh вне форума Ответить с цитированием
Старый 24.03.2015, 09:51   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
select parent.*, t.*, child.*
from t
left join t as parent on parent.id=t.parentid
left join t as children on children.parentid =t.id
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MS SQL SERVER 2005 копирование таблицы из ОДНОЙ БД В другую или перенести все строки из одной таблицы в другую reihtmonbern БД в Delphi 4 17.07.2012 23:25
Sql запрос. Из одной таблицы два раза templton SQL, базы данных 2 20.04.2011 17:47
Составной запрос, как правильно составить? Bendebej SQL, базы данных 10 26.02.2010 20:01
Передача данных из одной таблицы в другую, при выборе одной ячейки MickMick Microsoft Office Excel 6 06.10.2008 13:57
SQL запрос сразу по двум столбцам одной таблицы Иван БД в Delphi 6 03.01.2008 14:36