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

Откуда:
Сообщений: 5
Здравствуйте помогите пожалуйста сделать запрос. Я в скуле совсем плохо понимаю а тут такое запросили
Дано 2 таблицы
таб1
idИД отдела
name название отдела
parent_id Ид вышестоящего отдела

таб2
idИД отдела
Fioначальник отдела
iddИД начальника

заполненый вид таблицы
таб1
id name parent_id
1000 Департамент NULL
1100 Управление 1000
1110 Отдел 1100
1111 сектор 1110

таб2
id Fio idd
1000 Иванов 1
1100 Петров 2
1110 NULL 3
1111 NULL 4


Суть вытащить Fio и idd
Вытащить Fio начальника текущего отдела
в столбце parent_id указывается id вышестоящего отдела (id отделов рандомные для примера взял такие для удобства понимания)
Если у текущего отдела нет начальника взять фио выщестоящего начальника если и там нет то еще выще если есть то оставить текущий вложеность отделов где как иногда до 8 доходит

в итоге должжно получится
id Fio eid
1000 Иванов 1
1100 Петров 2
1110 Петров 3
1111 Петров 4

только таблицу менять ненадо результат надо просто вывести
11 мар 13, 18:26    [14036971]     Ответить | Цитировать Сообщить модератору
 Re: Проверка в цикле  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
-- test data
;with t1(id, name, parent_id) as (
select 1000, 'Департамент', NULL union all
select 1100, 'Управление', 1000 union all
select 1110, 'Отдел', 1100 union all
select 1111, 'сектор', 1110
), t2(id, Fio, idd) as (
select 1000, 'Иванов', 1 union all
select 1100, 'Петров', 2 union all
select 1110, NULL, 3 union all
select 1111, NULL, 4
)
-- end of test data
, cte as (
select t1.id, t2.Fio, t2.idd as eid
  from t1
  left join t2 on t2.id = t1.id
 where t1.parent_id is null
 union all
select t1.id, isnull(t_2.Fio, cte.Fio), t_2.idd
  from cte
  join t1 on t1.parent_id = cte.id
  outer apply (select id, Fio, idd from t2 where t2.id = t1.id) as t_2
)
select * from cte
11 мар 13, 18:47    [14037029]     Ответить | Цитировать Сообщить модератору
 Re: Проверка в цикле  [new]
akisha
Member

Откуда:
Сообщений: 5
Паганель,

Спасибо большое в данной инетрпритации работает только я непойму как переделать чтобы
избавиться от
select 1000, 'Иванов', 1 union all
select 1100, 'Петров', 2 union all
select 1110, NULL, 3 union all
select 1111, NULL, 4
а просто указать готовую базу с данными просто у меня строчек очень много
12 мар 13, 11:51    [14039207]     Ответить | Цитировать Сообщить модератору
 Re: Проверка в цикле  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
;with cte as (
select t1.id, t2.Fio, t2.idd as eid
  from t1
  left join t2 on t2.id = t1.id
 where t1.parent_id is null
 union all
select t1.id, isnull(t_2.Fio, cte.Fio), t_2.idd
  from cte
  join t1 on t1.parent_id = cte.id
  outer apply (select id, Fio, idd from t2 where t2.id = t1.id) as t_2
)
select * from cte
12 мар 13, 12:03    [14039310]     Ответить | Цитировать Сообщить модератору
 Re: Проверка в цикле  [new]
akisha
Member

Откуда:
Сообщений: 5
Паганель,

да спасибо все работает я нашел у себя проблему у меня null текстом был
12 мар 13, 12:56    [14039741]     Ответить | Цитировать Сообщить модератору
 Re: Проверка в цикле  [new]
akisha
Member

Откуда:
Сообщений: 5
а не подскажешь как можно сделать чтобы после использовать данный запрос в view
чтобы он в отдельном столбце там был ну либо вообще в качестве отдельного View я когда его добавляю
он у меня либо в качестве текста там отображается либо ругается на то что он не знает оператора (with)

просто мне по сути нужно его прилепить к запросу если поле contact = null тогда использовать значение из данного запроса и все это у меня во view
13 мар 13, 20:58    [14044677]     Ответить | Цитировать Сообщить модератору
 Re: Проверка в цикле  [new]
Гость333
Member

Откуда:
Сообщений: 3683
автор
;with cte as (

akisha
он у меня либо в качестве текста там отображается либо ругается на то что он не знает оператора (with)

Точку с запятой нужно ставить после операторов T-SQL, а не перед ними.
14 мар 13, 08:37    [14045670]     Ответить | Цитировать Сообщить модератору
 Re: Проверка в цикле  [new]
akisha
Member

Откуда:
Сообщений: 5
хоть так хоть так он все держит внутри cte а наружу неотдает
14 мар 13, 08:43    [14045686]     Ответить | Цитировать Сообщить модератору
 Re: Проверка в цикле  [new]
Гость333
Member

Откуда:
Сообщений: 3683
akisha
он все держит внутри cte

Каким образом вы это определили?
14 мар 13, 09:27    [14045831]     Ответить | Цитировать Сообщить модератору
 Re: Проверка в цикле  [new]
Гость333
Member

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

Ну и скрипты, при помощи которых вы пытались создать представление, покажите.
14 мар 13, 09:37    [14045877]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить