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

Откуда:
Сообщений: 16
Я выполняю запрос (SELECT). Он мне возвращает одну или несколько строк. Как мне эти строки "склеить" в одну.

Т.е. например есть таблица Users, с полями Family и Name.
Я делаю запрос

Select Name
From Users
Where Family = 'Иванов'

А мне бы нужно загнать все возвращаемые имена в строку, что-то типа: 'Иван, Петр, Василий'
11 фев 04, 15:59    [531307]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
KostyaSPB
Member

Откуда: Санкт-Петербург
Сообщений: 223
declare @var varchar(8000)
select @var=@var + t.name
from t
select @var
11 фев 04, 16:03    [531318]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
FAQ

для спящего время бодрствования равносильно сну
11 фев 04, 16:08    [531340]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
Николай МВ
Member

Откуда: Ukraine-Kyiv
Сообщений: 328
Может есть другие варианты, а я бы сделал через CURSOR.
11 фев 04, 16:56    [531507]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
KostyaSPB
Member

Откуда: Санкт-Петербург
Сообщений: 223
Через курсор будет медленней!
11 фев 04, 17:15    [531566]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
pavell
Member

Откуда:
Сообщений: 16
Пардон, труба позвала.

пробовал:


CREATE TABLE dbo.Users([Family] Char(40), [Name] Char(40))
GO

INSERT dbo.Users VALUES('Иванов', 'Иван')
INSERT dbo.Users VALUES('Иванов', 'Петр')
INSERT dbo.Users VALUES('Иванов', 'Степан')
GO


Declare @Result varchar(8000)
Select @Result = @Result + Users.Name
From Users

Select @Result
go

Drop Table dbo.Users
go


Но результат явно неожидаемый.... :-(
А было бы красиво.............................
11 фев 04, 17:36    [531618]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
Glory
Member

Откуда:
Сообщений: 104760
Но результат явно неожидаемый.... :-(
Как раз вполне ожидаемый - NULL+'что-то' дает в результате NULL. Хорошо бы было переменную @Result инициализировать ДО запуска запроса.
11 фев 04, 17:39    [531625]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
KostyaSPB
Member

Откуда: Санкт-Петербург
Сообщений: 223
Сорри.
Забыл.
Торопился.
Склероз проклятый. Glory прав про инициализацию.
11 фев 04, 17:43    [531634]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
pavell
Member

Откуда:
Сообщений: 16
Вот спасибо хорошо ... :-)

Ни как не привыкну к Билловым закидонам. У него и Г. поди тонет? :-)))))))))

Искренне, спасибо!
11 фев 04, 17:45    [531642]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
Николай МВ
Member

Откуда: Ukraine-Kyiv
Сообщений: 328
Поосторожнее с сокращениями... :)
11 фев 04, 17:56    [531670]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
harrytv
Member

Откуда: Loopback0
Сообщений: 141
А может все-таки можно:

Declare @Result varchar(8000)
Select @Result = RTRIM(ISNULL(@Result,'') + Users.Name)
From Users
11 фев 04, 21:18    [531972]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
KostyaSPB
Member

Откуда: Санкт-Петербург
Сообщений: 223
>harrytv
Тоже отличный вариант.
12 фев 04, 09:59    [532370]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
Glory
Member

Откуда:
Сообщений: 104760
Тогда уж

Declare @Result varchar(8000)
Select @Result = RTRIM(ISNULL(@Result,'') + ISNULL(Users.Name,''))
From Users
12 фев 04, 10:03    [532379]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
Shark
Member

Откуда:
Сообщений: 2365
select @result=@result+blablabla работает криво, и не обязан правильно работать. Никто этого не обещал. У меня с этим были трамблемы. Коротко, элегантно и .. неправильно. Надо курсором. Я так думаю.
12 фев 04, 10:05    [532383]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
Trong
Member

Откуда: Novosibirsk
Сообщений: 759
2 Shark: а в чем собственно кривость?
12 фев 04, 10:58    [532516]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
Trong
Member

Откуда: Novosibirsk
Сообщений: 759
1)
Declare @Result varchar(8000) 

Select @Result = RTRIM(ISNULL(@Result,'') + Users.Name)
From Users


2)
Declare @Result varchar(8000) 

set @result = ''
Select @Result = @Result + [Name]
From Users


Время выполнения м/у 1 и 2 - разы :)
12 фев 04, 11:07    [532540]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
harrytv
Member

Откуда: Loopback0
Сообщений: 141
Подводя итог можно сказать одно - не надо обижать Билла, кое что у него работает :-)
12 фев 04, 11:25    [532590]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
Shark
Member

Откуда:
Сообщений: 2365
Я затрудняюсь продемонстрировать конкретный пример, но у меня было, что процедура, написанная таким образом, возвращала неправильные данные (только одну строку). И, повторюсь, никто не обещал, что такой синтаксис работает. Про это было обсуждение с год назад:-)
12 фев 04, 11:37    [532622]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
Glory
Member

Откуда:
Сообщений: 104760
Я затрудняюсь продемонстрировать конкретный пример, но у меня было, что процедура, написанная таким образом, возвращала неправильные данные (только одну строку).
Это при использовании ORDER BY в запросе
12 фев 04, 11:39    [532626]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31601
2Shark
Понятно, что это не документированный способ, и его лучьше не использовать. Но я не могу себя заставить :-(
И с нетерпением жду строковой SUM....
12 фев 04, 11:49    [532651]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
Leshich
Member

Откуда: Ёбург
Сообщений: 21
2 Trong

а в чем разница?

проверил так


CREATE TABLE #Users([Family] Char(40), [Name] Char(40))
INSERT #Users VALUES('Иванов', 'Иван')
INSERT #Users VALUES('Иванов', 'Петр')
INSERT #Users VALUES('Иванов', 'Степан')

go

Declare @Result varchar(8000)
Select @Result = RTRIM(ISNULL(@Result,'') + ISNULL(#Users.Name,''))
From #Users

Select @Result

go
Declare @Result varchar(8000)
set @result = ''
Select @Result = RTRIM(ISNULL(@Result,'') + ISNULL(#Users.Name,''))
From #Users

Select @Result


планы одинковые, трейсы тоже...
а все таки T-SQL действительно нормально понимает @Result=@Result+n?
ведь действительно первой приходит мысль о курсоре (както надежнее кажется)


Реальность - это иллюзия, созданная отсутствием алкоголя
12 фев 04, 11:54    [532662]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
Trong
Member

Откуда: Novosibirsk
Сообщений: 759
У меня вариант 2 отрабатывает (судя по времени в статусе QA) на таблице в которой 2 000 000 записей в 25 раз медленне, чем вариант 1 ... а 3 записи это не серьезно :)
12 фев 04, 12:01    [532678]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
Trong
Member

Откуда: Novosibirsk
Сообщений: 759
Блин! 2) быстрее чем 1) ... ошибся :)
12 фев 04, 12:09    [532700]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
harrytv
Member

Откуда: Loopback0
Сообщений: 141
to Trong
А если Name в таблице будет null ?
12 фев 04, 12:10    [532703]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк в одну  [new]
Leshich
Member

Откуда: Ёбург
Сообщений: 21
дык понятно что несерьезно...
Нет возможности на больших объемах проверить

разница то в set или в проверке на Null?


Реальность - это иллюзия, созданная отсутствием алкоголя
12 фев 04, 12:11    [532708]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить