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

Откуда:
Сообщений: 264
В одной таблице столбец типа uniqueidentifier, в другой - типа xml. Внутри xml-евского столбца такие данные:

<dictionary>
<item>
<key>
<string>MKSBGUID</string>
</key>
<value>
<string>740dc6b5-efae-4558-a226-656483b03dd7</string>
</value>
</item>
</dictionary>

Нужно связать эти две таблицы в запросе select. Как это сделать, учитывая тип xml?
7 май 15, 13:19    [17612519]     Ответить | Цитировать Сообщить модератору
 Re: Как связать две таблицы (столбец типа uniqueidentifier-столбец типа xml)?  [new]
Glory
Member

Откуда:
Сообщений: 104760
seg856
Как это сделать, учитывая тип xml?

наверное надо извлечь это значение из xml. А потом уже связывать
7 май 15, 13:21    [17612536]     Ответить | Цитировать Сообщить модератору
 Re: Как связать две таблицы (столбец типа uniqueidentifier-столбец типа xml)?  [new]
seg856
Member

Откуда:
Сообщений: 264
Нет специальных функций для извлечения из xml для ms sql server 2012?
7 май 15, 13:24    [17612557]     Ответить | Цитировать Сообщить модератору
 Re: Как связать две таблицы (столбец типа uniqueidentifier-столбец типа xml)?  [new]
Merdoc
Member

Откуда: Новосибирск
Сообщений: 103
seg856,
Есть
https://msdn.microsoft.com/ru-ru/library/ms190798.aspx
7 май 15, 13:25    [17612566]     Ответить | Цитировать Сообщить модератору
 Re: Как связать две таблицы (столбец типа uniqueidentifier-столбец типа xml)?  [new]
Glory
Member

Откуда:
Сообщений: 104760
seg856
Нет специальных функций для извлечения из xml для ms sql server 2012?

Разумеется есть
7 май 15, 13:26    [17612572]     Ответить | Цитировать Сообщить модератору
 Re: Как связать две таблицы (столбец типа uniqueidentifier-столбец типа xml)?  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE @xml XML = '
<dictionary>
	<item>
		<key>
			<string>MKSBGUID</string>
		</key>
		<value>
			<string>740dc6b5-efae-4558-a226-656483b03dd7</string>
		</value>
	</item>
</dictionary>'

SELECT
	  t.c.value('key[1]/*[1]', 'VARCHAR(255)')
	, t.c.value('value[1]/*[1]', 'UNIQUEIDENTIFIER')
FROM @xml.nodes('*/*') t(c)


Так и не понял, что с чем Вы будете связывать.
7 май 15, 13:45    [17612746]     Ответить | Цитировать Сообщить модератору
 Re: Как связать две таблицы (столбец типа uniqueidentifier-столбец типа xml)?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
CREATE TABLE #T(X XML)

INSERT INTO #T (X) VALUES(N'<dictionary>
<item>
<key>
<string>MKSBGUID</string>
</key>
<value>
<string>740dc6b5-efae-4558-a226-656483b03dd7</string>
</value>
</item>
</dictionary>');

SELECT id = XX.I.value('(./value/string)[1]', 'uniqueidentifier')
FROM #T T CROSS APPLY T.X.nodes('/dictionary/item') XX(I);
GO
DROP TABLE #T
7 май 15, 13:46    [17612763]     Ответить | Цитировать Сообщить модератору
 Re: Как связать две таблицы (столбец типа uniqueidentifier-столбец типа xml)?  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
CREATE TABLE #T(X XML)
INSERT INTO #T (X) VALUES(N'<dictionary>
<item>
<key>
<string>MKSBGUID</string>
</key>
<value>
<string>740dc6b5-efae-4558-a226-656483b03dd7</string>
</value>
</item>
</dictionary>');

CREATE TABLE #U(U uniqueidentifier,res varchar(100))
INSERT INTO #U (U,res) VALUES('740dc6b5-efae-4558-a226-656483b03dd7','связать две таблицы (столбец типа uniqueidentifier-столбец типа xml')

SELECT U.res
FROM #T T CROSS APPLY T.X.nodes('/dictionary/item[key/string = "MKSBGUID"]') XX(I)
JOIN #U U ON U.U = XX.I.value('(./value/string)[1]', 'uniqueidentifier')
GO
DROP TABLE #T
DROP TABLE #U
7 май 15, 14:49    [17613256]     Ответить | Цитировать Сообщить модератору
 Re: Как связать две таблицы (столбец типа uniqueidentifier-столбец типа xml)?  [new]
хмхмхм
Guest
seg856
В одной таблице столбец типа uniqueidentifier, в другой - типа xml. Внутри xml-евского столбца такие данные:

<dictionary>
<item>
<key>
<string>MKSBGUID</string>
</key>
<value>
<string>740dc6b5-efae-4558-a226-656483b03dd7</string>
</value>
</item>
</dictionary>

Нужно связать эти две таблицы в запросе select. Как это сделать, учитывая тип xml?


Самая плохая идея для оптимизатора - связывать по полю, над которым будет произведена операция.
7 май 15, 14:54    [17613286]     Ответить | Цитировать Сообщить модератору
 Re: Как связать две таблицы (столбец типа uniqueidentifier-столбец типа xml)?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
хмхмхм
seg856
В одной таблице столбец типа uniqueidentifier, в другой - типа xml. Внутри xml-евского столбца такие данные:

<dictionary>
<item>
<key>
<string>MKSBGUID</string>
</key>
<value>
<string>740dc6b5-efae-4558-a226-656483b03dd7</string>
</value>
</item>
</dictionary>

Нужно связать эти две таблицы в запросе select. Как это сделать, учитывая тип xml?


Самая плохая идея для оптимизатора - связывать по полю, над которым будет произведена операция.


Если XML index создать, будет очень неплохо летать
7 май 15, 15:08    [17613383]     Ответить | Цитировать Сообщить модератору
 Re: Как связать две таблицы (столбец типа uniqueidentifier-столбец типа xml)?  [new]
хмхмхм
Guest
a_voronin
хмхмхм
пропущено...


Самая плохая идея для оптимизатора - связывать по полю, над которым будет произведена операция.


Если XML index создать, будет очень неплохо летать


Никогда ими не пользовался, поэтому ничего сказать про скорость не могу, но вот это:

https://msdn.microsoft.com/ru-ru/library/ms191497.aspx
They index all tags, values and paths over the XML instances in the column and benefit query performance.


меня настораживает.

Зачем такой геморрой и куча лишних индексируемых полей (тегов), когда можно просто выделить одно поле и записывать его автоматически в отдельную колонку этой же таблицы, а уже потом связывать по этому полю?
7 май 15, 15:40    [17613594]     Ответить | Цитировать Сообщить модератору
 Re: Как связать две таблицы (столбец типа uniqueidentifier-столбец типа xml)?  [new]
seg856
Member

Откуда:
Сообщений: 264
LexusR, сделал по Вашему примеру.
Почему-то выбранные строки дублируются 26-28 раз. Как это объяснить?

Мой запрос:

SELECT u.FAMILY, u.Name, u.OT, t.N_NWDS
FROM hlt_notworkdoc T CROSS APPLY T.xmldata.nodes('/dictionary/item[key/string = "MKSBGUID"]') XX(I)
JOIN Life_stt_MedicalHistory U ON U.UGUID = XX.I.value('(./value/string)[1]', 'uniqueidentifier')
7 май 15, 16:55    [17614108]     Ответить | Цитировать Сообщить модератору
 Re: Как связать две таблицы (столбец типа uniqueidentifier-столбец типа xml)?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
seg856
LexusR, сделал по Вашему примеру.
Почему-то выбранные строки дублируются 26-28 раз. Как это объяснить?

Мой запрос:

SELECT u.FAMILY, u.Name, u.OT, t.N_NWDS
FROM hlt_notworkdoc T CROSS APPLY T.xmldata.nodes('/dictionary/item[key/string = "MKSBGUID"]') XX(I)
JOIN Life_stt_MedicalHistory U ON U.UGUID = XX.I.value('(./value/string)[1]', 'uniqueidentifier')


Для этого надо знать, что у вас там лежит. У вас один XML c таким значением MKSBGUID
7 май 15, 20:16    [17615081]     Ответить | Цитировать Сообщить модератору
 Re: Как связать две таблицы (столбец типа uniqueidentifier-столбец типа xml)?  [new]
seg856
Member

Откуда:
Сообщений: 264
a_voronin, да. В обеих таблицах эти значения уникальны.
8 май 15, 07:57    [17616096]     Ответить | Цитировать Сообщить модератору
 Re: Как связать две таблицы (столбец типа uniqueidentifier-столбец типа xml)?  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
seg856
a_voronin, да. В обеих таблицах эти значения уникальны.

---- если у вас одна запись(и один узел в xml) на каждый GUID в обоих таблицах то ничего множить НЕ ДОЛЖНО
CREATE TABLE #T(X XML,id int)
INSERT INTO #T (X,id) VALUES(N'<dictionary>
<item>
<key>
<string>MKSBGUID</string>
</key>
<value>
<string>740dc6b5-efae-4558-a226-656483b03dd7</string>
</value>
</item>
</dictionary>',1)
,(N'<dictionary>
<item>
<key>
<string>MKSBGUID</string>
</key>
<value>
<string>740dc6b5-efae-4558-0000-656483b03dd7</string>
</value>
</item>
</dictionary>',2)


CREATE TABLE #U(U uniqueidentifier,res varchar(100))
INSERT INTO #U (U,res) VALUES('740dc6b5-efae-4558-a226-656483b03dd7','связать две таблицы (столбец типа uniqueidentifier-столбец типа xml')
,('740dc6b5-efae-4558-0000-656483b03dd7','другой идентификатор')

SELECT U.res,T.ID
FROM #T T 
CROSS APPLY T.X.nodes('/dictionary/item[key/string = "MKSBGUID"]') XX(I)
JOIN #U U ON U.U = XX.I.value('(./value/string)[1]', 'uniqueidentifier')
GO
DROP TABLE #T
DROP TABLE #U

---- ищите дублирующие узлы или строки или поставьте DISTINCT
SELECT DISTINCT u.FAMILY, u.Name, u.OT, t.N_NWDS
FROM hlt_notworkdoc T CROSS APPLY T.xmldata.nodes('/dictionary/item[key/string = "MKSBGUID"]') XX(I)
JOIN Life_stt_MedicalHistory U ON U.UGUID = XX.I.value('(./value/string)[1]', 'uniqueidentifier') 
8 май 15, 08:25    [17616145]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить