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

Откуда:
Сообщений: 11
Здравствуйте, уважаемые. Не могу доделать запрос. Беда в том, что он включает работу с XML, которые я не очень хорошо понимаю.
Имеется таблица сотрудников, в которой в XML поле хранятся руководители сотрудника. Руководтели могут быть нескольких типов: непосредственный, функциональный, по обучению и т.д. Типы хранятся в отдельной таблице. Связка таблиц происходит по XML полю.
Необходимо отобрать тех сотрудников, у которых указан руководитель. Если руководителей несколько, предпочтительно отобрать функционального. Будь это обычная таблица -- проблем бы не было, а так -- голову свернул.
Прилагаю пример:

DECLARE @users TABLE (
	[id] bigint, 
	[name] varchar(100), 
	[data] xml
)

DECLARE @types TABLE (
	[id] bigint, 
	[code] varchar(100), 
	[name] varchar(100)
)

INSERT INTO @users VALUES
(1, 'Иванов Иван', 
'<func_managers>
  <func_manager>
    <person_id>4</person_id>
    <boss_type_id>2</boss_type_id>
  </func_manager>
  <func_manager>
    <person_id>5</person_id>
    <boss_type_id>1</boss_type_id>
  </func_manager>
</func_managers>'), 
(2, 'Петров Петр', 
'<func_managers>
  <func_manager>
    <person_id>5</person_id>
    <boss_type_id>1</boss_type_id>
  </func_manager>
</func_managers>'),
(3, 'Сидоров Сидор', ''),
(4, 'Сергеев Сергей', ''),
(5, 'Дмитриев Дмитрий', '')

INSERT INTO @types VALUES 
(1, 'main', 'Непосредственный'),
(2, 'func', 'Функциональный')

SELECT 
	u.name AS user_name
	,b.name AS boss_name
	,t.name AS boss_type
FROM @users AS u
CROSS APPLY u.data.nodes('func_managers/func_manager') bs(l)
JOIN @users AS b ON b.id = bs.l.query('data(person_id)').value('.', 'bigint')
JOIN @types AS t ON t.id = bs.l.query('data(boss_type_id)').value('.', 'bigint')
12 авг 16, 15:13    [19534708]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML поля  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
sniffysko,

так?
SELECT 
	u.name AS user_name
	,tt.boss_name
	,tt.boss_type
  
FROM @users AS u
CROSS apply 
(
  select top (1) b.name as boss_name, t.name as boss_type from u.data.nodes('func_managers/func_manager') bs(l)
  JOIN @users AS b ON b.id = bs.l.query('data(person_id)').value('.', 'bigint')
  JOIN @types AS t ON t.id = bs.l.query('data(boss_type_id)').value('.', 'bigint')
  order by case when t.code = 'func' then 0 else 1 end
) tt
12 авг 16, 15:24    [19534780]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML поля  [new]
sniffysko
Member

Откуда:
Сообщений: 11
Точно! Спасибо огромное! Вы меня категорически выручили.
12 авг 16, 16:09    [19534964]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить