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

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

Каким образом можно получить всех партнеров и строку с названиями всех станций метро связанных с партнером:

Партнер1 | ВДНХ, Ботанический сад
Партнер2 | Домодедово
Партнер3 | NULL
...

SELECT pp.PR_KEY
	, pp.PR_NAME
	, (	SELECT mm.MN_NAME
		FROM MetroNodes mm
			INNER JOIN PartnersLinkMetro lm ON mm.MN_KEY = lm.MN_KEY
		WHERE lm.PR_KEY = pp.PR_KEY )
FROM Partners pp
ORDER BY pp.PR_KEY
24 июл 09, 10:03    [7454621]     Ответить | Цитировать Сообщить модератору
 Re: Результаты подзапроса как строка  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36814
Строки в MSSQL конкатенируются операцией +.
24 июл 09, 10:04    [7454623]     Ответить | Цитировать Сообщить модератору
 Re: Результаты подзапроса как строка  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
https://www.sql.ru/faq/faq_topic.aspx?fid=731
24 июл 09, 10:05    [7454626]     Ответить | Цитировать Сообщить модератору
 Re: Результаты подзапроса как строка  [new]
Alex_BBB
Member

Откуда:
Сообщений: 1197
pkarklin
https://www.sql.ru/faq/faq_topic.aspx?fid=731

Спасибо.

SELECT pp.PR_KEY
	, pp.PR_NAME
	, metro = (	SELECT mm.MN_NAME
		FROM MetroNodes mm
			INNER JOIN PartnersLinkMetro lm ON mm.MN_KEY = lm.MN_KEY
		WHERE lm.PR_KEY = pp.PR_KEY for xml path)		
FROM Partners pp
ORDER BY pp.PR_KEY
Выдает вот такое:
Партнер1 | <row><MN_NAME>Черкизовская</MN_NAME></row><row><MN_NAME>Преображенская площадь</MN_NAME></row>
Не много не то что нужно - как перечислисть через запятую без XML ?
(Можно конечно replace сделать, что бы получить...)
24 июл 09, 10:22    [7454701]     Ответить | Цитировать Сообщить модератору
 Re: Результаты подзапроса как строка  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Alex_BBB
Не много не то что нужно - как перечислисть через запятую без XML ?


Конечно, не то, что нужно. Для того чтобы было то, что нужно, надо всю часть for xml path(...) до конца скопировать из FAQа, а не заниматься отсебятиной.

Сообщение было отредактировано: 24 июл 09, 10:28
24 июл 09, 10:28    [7454732]     Ответить | Цитировать Сообщить модератору
 Re: Результаты подзапроса как строка  [new]
Alex_BBB
Member

Откуда:
Сообщений: 1197
pkarklin

надо всю часть for xml path(...) до конца скопировать из FAQа


SELECT pp.PR_KEY
	, pp.PR_NAME
	, metro = (	SELECT mm.MN_NAME
		FROM MetroNodes mm
			INNER JOIN PartnersLinkMetro lm ON mm.MN_KEY = lm.MN_KEY
		WHERE lm.PR_KEY = pp.PR_KEY for xml path(''))		
FROM Partners pp
ORDER BY pp.PR_KEY
Тогда такое
<MN_NAME>Черкизовская</MN_NAME><MN_NAME>Преображенская площадь</MN_NAME>
...
24 июл 09, 10:33    [7454757]     Ответить | Цитировать Сообщить модератору
 Re: Результаты подзапроса как строка  [new]
Glory
Member

Откуда:
Сообщений: 104760
А если еще раз попробовать полностью скопировать пример из FAQ ?
24 июл 09, 10:34    [7454770]     Ответить | Цитировать Сообщить модератору
 Re: Результаты подзапроса как строка  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Alex_BBB
(Можно конечно replace сделать, что бы получить...)


Не можно, а нужно!

ВЫ хоть пример из FAQа разобрали то?!
24 июл 09, 10:36    [7454783]     Ответить | Цитировать Сообщить модератору
 Re: Результаты подзапроса как строка  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Glory
А если еще раз попробовать полностью скопировать пример из FAQ ?
+1
Или так:
SELECT
 pp.PR_KEY
,pp.PR_NAME
,metro=STUFF((SELECT ', '+mm.MN_NAME
	      FROM MetroNodes mm
	      JOIN PartnersLinkMetro lm ON mm.MN_KEY=lm.MN_KEY
	      WHERE lm.PR_KEY=pp.PR_KEY
	      FOR XML PATH('')),1,2,'')		
FROM Partners pp
ORDER BY pp.PR_KEY
24 июл 09, 10:40    [7454819]     Ответить | Цитировать Сообщить модератору
 Re: Результаты подзапроса как строка  [new]
Alex_BBB
Member

Откуда:
Сообщений: 1197
Всем спасибо!

SELECT top 100 pp.PR_KEY
	, pp.PR_NAME
	, metro = replace((	SELECT mm.MN_NAME as 'data()'
		FROM MetroNodes mm
			INNER JOIN PartnersLinkMetro lm ON mm.MN_KEY = lm.MN_KEY
		WHERE lm.PR_KEY = pp.PR_KEY for xml path('')),' ',', ')
FROM Partners pp
ORDER BY pp.PR_KEY
24 июл 09, 10:50    [7454882]     Ответить | Цитировать Сообщить модератору
 Re: Результаты подзапроса как строка  [new]
Alex_BBB
Member

Откуда:
Сообщений: 1197
Недостаток обнаружил - если название меторо содержит пробел, то он то же заменяетс яна запятую.
Вот такой результат
Партнер3 | Черкизовская, Преображенская, площадь
24 июл 09, 14:18    [7456693]     Ответить | Цитировать Сообщить модератору
 Re: Результаты подзапроса как строка  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Тогда по старинке:

https://www.sql.ru/faq/faq_topic.aspx?fid=130
24 июл 09, 14:22    [7456727]     Ответить | Цитировать Сообщить модератору
 Re: Результаты подзапроса как строка  [new]
iljy
Member

Откуда:
Сообщений: 8711
Alex_BBB
Недостаток обнаружил - если название меторо содержит пробел, то он то же заменяетс яна запятую.
Вот такой результат
Партнер3 | Черкизовская, Преображенская, площадь


сделайте
SELECT ',' +  mm.MN_NAME as 'data()'
...

первую запятую потом удалите:)
24 июл 09, 14:29    [7456801]     Ответить | Цитировать Сообщить модератору
 Re: Результаты подзапроса как строка  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Alex_BBB
Недостаток обнаружил - если название меторо содержит пробел, то он то же заменяетс яна запятую.
Вот такой результат
Партнер3 | Черкизовская, Преображенская, площадь
Доктор, меня не замечают!
24 июл 09, 14:34    [7456865]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить