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

Откуда:
Сообщений: 1907
Был на собеседовании - попросили написать запрос, который выберет из таблицы Person

id name person_id

Всю иерархию подчиненности.
3 апр 15, 21:40    [17471959]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку из зацикленной таблицы  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
redwhite90,

бывает
3 апр 15, 21:56    [17472007]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку из зацикленной таблицы  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
churupaha
redwhite90,

бывает


троллинг засчитан)

поможете ответить?
3 апр 15, 22:43    [17472178]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку из зацикленной таблицы  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
допустим таблица создаётся таким скриптом:
CREATE TABLE person
(
  id bigint NOT NULL,
  name character varying(255),
  head_id bigint,
  CONSTRAINT person_pkey PRIMARY KEY (id ),
  CONSTRAINT fkc4e39b55b5ec36d4 FOREIGN KEY (head_id)
      REFERENCES person (id) MATCH SIMPLE      
)

данные выглядят следующим образом:
Картинка с другого сайта.
3 апр 15, 23:49    [17472416]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку из зацикленной таблицы  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
redwhite90

поможете ответить?


+ например (по моему ты ошибся веткой)


;with
person(id, name, head_id) as
(
	select 6, '66', 3 union all
	select 1, '11', null union all
	select 2, '22', 1 union all
	select 3, '33', 2 union all
	select 4, '44', 2 union all
	select 5, '55', 2
),
h as
(
	select 
		0 as lvl, 
		cast(id as varbinary(900)) as ptn, 
		--cast('/' + str(id) as varchar(900)) collate Latin1_General_BIN as ptn, 
		id, 
		name, 
		head_id
	from
		person
	where
		head_id is null

	union all

	select 
		h.lvl + 1, 
		cast(h.ptn + cast(p.id as varbinary(900)) as varbinary(900)),
		--cast(h.ptn + '/' + str(p.id) as varchar(900)) collate Latin1_General_BIN, 
		p.id, 
		p.name, 
		p.head_id
	from
		h
			inner join
		person p on h.id = p.head_id
)
select
	replicate(replicate(' ', 5), lvl) + '|-' + name as tree
from
	h
order by
	ptn;



|-11
|-22
|-33
|-66
|-44
|-55

4 апр 15, 00:35    [17472530]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку из зацикленной таблицы  [new]
o-o
Guest
redwhite90
[...]
CREATE TABLE person
(
  id bigint NOT NULL,
  name character varying(255),
)
[...]

PostgreSQL???
хотя в соседнем топике намекают, что определяющим является тэг, в к-ый заключаешь код :)
4 апр 15, 00:54    [17472579]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку из зацикленной таблицы  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
o-o
redwhite90
[...]
CREATE TABLE person
(
  id bigint NOT NULL,
  name character varying(255),
)
[...]

PostgreSQL???
хотя в соседнем топике намекают, что определяющим является тэг, в к-ый заключаешь код :)


в соседнем топике было про тэг SO

Да, действительно это Postgre, но опять же нужно решение независимое от конкретной СУБД
4 апр 15, 01:09    [17472600]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку из зацикленной таблицы  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
churupaha
redwhite90
поможете ответить?


+ например (по моему ты ошибся веткой)


;with
person(id, name, head_id) as
(
	select 6, '66', 3 union all
	select 1, '11', null union all
	select 2, '22', 1 union all
	select 3, '33', 2 union all
	select 4, '44', 2 union all
	select 5, '55', 2
),
h as
(
	select 
		0 as lvl, 
		cast(id as varbinary(900)) as ptn, 
		--cast('/' + str(id) as varchar(900)) collate Latin1_General_BIN as ptn, 
		id, 
		name, 
		head_id
	from
		person
	where
		head_id is null

	union all

	select 
		h.lvl + 1, 
		cast(h.ptn + cast(p.id as varbinary(900)) as varbinary(900)),
		--cast(h.ptn + '/' + str(p.id) as varchar(900)) collate Latin1_General_BIN, 
		p.id, 
		p.name, 
		p.head_id
	from
		h
			inner join
		person p on h.id = p.head_id
)
select
	replicate(replicate(' ', 5), lvl) + '|-' + name as tree
from
	h
order by
	ptn;



|-11
|-22
|-33
|-66
|-44
|-55



with
has
lvl

как-то страшно
4 апр 15, 01:12    [17472604]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку из зацикленной таблицы  [new]
o-o
Guest
redwhite90
в соседнем топике было про тэг SO
Да, действительно это Postgre, но опять же нужно решение независимое от конкретной СУБД

так это снова вы? :)
я засыпаю, поэтому мне все на одно лицо, извините.
рекурсия в разных СУБД по-разному реализована,
так что тут универсального решения не будет.
ораклоиды используют connect by level,
про других не знаю,
все, спокойной ночи :)
4 апр 15, 01:30    [17472623]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку из зацикленной таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
o-o
redwhite90
[...]
CREATE TABLE person
(
  id bigint NOT NULL,
  name character varying(255),
)

[...]

PostgreSQL???
хотя в соседнем топике намекают, что определяющим является тэг, в к-ый заключаешь код :)
character varying - это синоним varchar. Прекрасно работает в MSSQL. Только писать больно много
4 апр 15, 11:07    [17473055]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку из зацикленной таблицы  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
iap
Прекрасно работает в MSSQL.

к чему эта фраза относится?
6 апр 15, 12:40    [17478300]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку из зацикленной таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
redwhite90
iap
Прекрасно работает в MSSQL.

к чему эта фраза относится?

character varying(255)

А универсального для всех баз синтаксиса рекурсивного запроса нет
6 апр 15, 12:41    [17478308]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку из зацикленной таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
redwhite90
iap
Прекрасно работает в MSSQL.

к чему эта фраза относится?
Вроде как начали писать, что раз character varying, то это PostgreSQL.
Вот я и удивился - MSSQL спокойно принимает этот тип данных как эквивалент varchar.
6 апр 15, 13:23    [17478568]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку из зацикленной таблицы  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
Glory
redwhite90
пропущено...

к чему эта фраза относится?

character varying(255)

А универсального для всех баз синтаксиса рекурсивного запроса нет


печально. Вообще судя по тому, что меня спрашивали до этого от меня хотели услышать запрос с каким-то из join ов
6 апр 15, 14:00    [17478808]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку из зацикленной таблицы  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
redwhite90
Вообще судя по тому, что меня спрашивали до этого от меня хотели услышать запрос с каким-то из join ов


+ учтем

Картинка с другого сайта.
6 апр 15, 14:07    [17478858]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку из зацикленной таблицы  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1756
redwhite90
Был на собеседовании - попросили написать запрос, который выберет из таблицы Person

id name person_id

Всю иерархию подчиненности.

Иерархию подчиненности в MSSQL оптимально выводить только с использование рекурсивного-CTE.
7 апр 15, 11:40    [17482615]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить