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

Откуда:
Сообщений: 21
Всем привет!
Помогите, пожалуйста, с переменной.
Есть таблица с продуктами (порядка 1,5 тыс) (пример с id_product=210):
 select id_product as id_product_parent
, product_name as product_name_parent
from dic_product
where id_product=210

Результат:
id_product_parent	product_name_parent
210	             Аккредитивы


Большинство продуктов являются "родителями" для других продуктов.
Для продукта id_product=210 это:
SELECT id_product as id_product_childs
, product_name as product_name_childs
FROM [fGET_DIC_PRODUCT_CHILDS] (210,1,1,1)

Результат:
id_product_childs	product_name_childs
211	            Экспортные аккредитивы с отсрочкой платежа банкам
212	            Аккредитивы покрытые клиентскими средствами(внутренние аккредитивы)
2179	            Рамбурсные обязательства (импорт)
214	            Аккредитивы без покрытия (без финансирования)


Нужно сделать справочник продуктов "родитель-ребенок". Типа:
id_product_parent	product_name_parent	id_product_childs	product_name_childs
210	Аккредитивы	211	Экспортные аккредитивы с отсрочкой платежа банкам
210	Аккредитивы	212	Аккредитивы покрытые клиентскими средствами(внутренние аккредитивы)
210	Аккредитивы	2179	Рамбурсные обязательства (импорт)
210	Аккредитивы	214	Аккредитивы без покрытия (без финансирования)


Продукты довольно часто удаляются и добавляется.

Помоги, пожалуйста, написать скрипт, который будет создавать справочник продуктов с использованием переменной, без подставления конкретных id_product

Заранее спасибо!
20 мар 14, 11:54    [15758096]     Ответить | Цитировать Сообщить модератору
 Re: Переменная  [new]
icprog
Member

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

Видимо, так:
declare @id int

set @id=210

SELECT id_product as id_product_childs
, product_name as product_name_childs
FROM [fGET_DIC_PRODUCT_CHILDS] (@id,1,1,1)
20 мар 14, 12:16    [15758327]     Ответить | Цитировать Сообщить модератору
 Re: Переменная  [new]
lbdvol
Member

Откуда:
Сообщений: 21
icprog,
не совсем то.

1. Каждую переменную (id_product) здесь придется прописывать вручную.
Это не вариант, т.к. всего продуктов 1,5 тыс.
Можно ли, чтобы в переменную проставлялись автоматически все id из таблицы продуктов (dic_product)?

2. Эта процедура выдает список детей, которые входят в родительский продукт (id_product=210),
а нужно 4 поля - два поля с детьми и их соответствие с родителями.
20 мар 14, 12:29    [15758484]     Ответить | Цитировать Сообщить модератору
 Re: Переменная  [new]
icprog
Member

Откуда:
Сообщений: 166
Тогда посмотрите в сторону CROSS APPLY http://t-sql.ru/post/CrossApply.aspx
20 мар 14, 12:44    [15758661]     Ответить | Цитировать Сообщить модератору
 Re: Переменная  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Вам нужна не переменная вам нужна связка.

Если в функции берутся только потомки первого уровня, то интрефейс у этой функции неправильный.
Нет смысла ставить линейный элемент как параметр, это можно и через связку сделать (WHERE, ON). И следовательно не надо вынужденно использовать APPLY и запутывать скуль через него.

Если функция древовидная (следовательно параметр не такой линейный, хотя это спорно), то неправильно будет использовать её для этой задачи (или колонки нормально прописать и постановку задачи подрихтовать - вывернуть запрос).

Да и объяснять бессмысленно, человек очень далёк от реляционного подхода, нужно основы ещё понять.
21 мар 14, 00:10    [15763328]     Ответить | Цитировать Сообщить модератору
 Re: Переменная  [new]
west74
Member

Откуда: Челябинск
Сообщений: 76
а есть уверенность что справочник в один уровень?
Вам рекурсия в помощ IHMO

как то так:
declare @t table (product_id int,name varchar(100),parent_id int);
insert into @t (product_id,name,parent_id )
values (210,'Аккредитивы',null),
(211,'Экспортные аккредитивы с отсрочкой платежа банкам',210),
(212,'Аккредитивы покрытые клиентскими средствами(внутренние аккредитивы)',210),
(2179,'Рамбурсные обязательства (импорт)',211),
(214,'Аккредитивы без покрытия (без финансирования)',210)


begin
declare @a int;

set @a=210;

with ct (product_id,name,parent_id)
as
(
select product_id,name,parent_id from @t where product_id=@a
union all
select t.product_id,t.name,t.parent_id from @t as t
join ct on ct.product_id=t.parent_id
)


select * from ct;

end
21 мар 14, 07:17    [15763774]     Ответить | Цитировать Сообщить модератору
 Re: Переменная  [new]
west74
Member

Откуда: Челябинск
Сообщений: 76
чтоб ответить на вопрос

create table #t (product_id int,name varchar(100),parent_id int);
insert into #t (product_id,name,parent_id )
values (210,'Аккредитивы',null),
(211,'Экспортные аккредитивы с отсрочкой платежа банкам',210),
(212,'Аккредитивы покрытые клиентскими средствами(внутренние аккредитивы)',210),
(2179,'Рамбурсные обязательства (импорт)',211),
(214,'Аккредитивы без покрытия (без финансирования)',210);


create procedure [fGET_DIC_PRODUCT_CHILDS] @a int
as
begin
with ct (product_id,name,parent_id)
as
(
select product_id,name,parent_id from #t where product_id=@a
union all
select t.product_id,t.name,t.parent_id from #t as t
join ct on ct.product_id=t.parent_id
)
select * from ct
join #t as t on ct.parent_id=t.product_id where ct.parent_id is not null;
end

exec [fGET_DIC_PRODUCT_CHILDS] @a=210
21 мар 14, 07:33    [15763798]     Ответить | Цитировать Сообщить модератору
 Re: Переменная  [new]
Диклевич Александр
Member

Откуда:
Сообщений: 610
так уже подсказали CROSS APPLY, что-то вроде:
select p.id_product as id_product_parent
, p.product_name as product_name_parent
,cp.id_product as id_product_childs
,cp.product_name as product_name_childs
from dic_product p
CROSS APPLY [fGET_DIC_PRODUCT_CHILDS] (p.id_product,1,1,1) cp
21 мар 14, 09:40    [15764039]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить