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

Откуда: СССР
Сообщений: 97
Помогите решить проблемку.

Есть примерно такая табличка:
Name
Киев
Киев Моссква
Киев Моссква Киев
Киев Моссква Киев Киев Моссква Киев
Киев Моссква
Киев Моссква Киев
...

Из нее нужно получить такую:
Name
Киев
Киев
Моссква
Киев
Киев
Киев
Моссква
Киев
Киев
Моссква
Киев
Киев
Моссква
Киев
Моссква
Киев

количество слов в названии может доходить до 15-17 :(
24 авг 07, 02:37    [4569592]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
declare @t table (name varchar(255))
insert into @t
select 'Киев'
union all
select 'Киев Моссква'
union all
select 'Киев Моссква Киев'
union all
select 'Киев Моссква Киев Киев Моссква Киев'
union all
select 'Киев Моссква'
union all
select 'Киев Моссква Киев'

declare @str varchar(max)

set @str=''
select @str=@str+' '+name from @t
set @str='select '''+replace(ltrim(@str), ' ', ''' as City union all select ''')+''''

exec(@str)
24 авг 07, 07:25    [4569704]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
https://www.sql.ru/articles/mssql/03060701ArraysAndListsInSQLServer.shtml
24 авг 07, 07:50    [4569728]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
ac86
Member

Откуда: СССР
Сообщений: 97
Knyazev Alexey
declare @t table (name varchar(255))
insert into @t
select 'Киев'
union all
select 'Киев Моссква'
union all
select 'Киев Моссква Киев'
union all
select 'Киев Моссква Киев Киев Моссква Киев'
union all
select 'Киев Моссква'
union all
select 'Киев Моссква Киев'

declare @str varchar(max)

set @str=''
select @str=@str+' '+name from @t
set @str='select '''+replace(ltrim(@str), ' ', ''' as City union all select ''')+''''

exec(@str)



А без использования каких либо переменных это возможно?
24 авг 07, 11:16    [4570757]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
ac86
Knyazev Alexey
declare @t table (name varchar(255))
insert into @t
select 'Киев'
union all
select 'Киев Моссква'
union all
select 'Киев Моссква Киев'
union all
select 'Киев Моссква Киев Киев Моссква Киев'
union all
select 'Киев Моссква'
union all
select 'Киев Моссква Киев'

declare @str varchar(max)

set @str=''
select @str=@str+' '+name from @t
set @str='select '''+replace(ltrim(@str), ' ', ''' as City union all select ''')+''''

exec(@str)



А без использования каких либо переменных это возможно?


возможно:

with cte(city, val)
as
(
select top 1 convert(varchar(max),''), (select name+' ' from @t for xml path('')) 
from @t
union all
select convert(varchar(max), substring(val, 1, charindex(' ', val))), stuff(val, 1, charindex(' ', val), '') 
from cte where val!=''
)
select city from cte where city!=''
24 авг 07, 11:47    [4571045]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
ac86
Member

Откуда: СССР
Сообщений: 97
А вот еще чтобы без СТЕ?
24 авг 07, 11:51    [4571090]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36829
ac86
А вот еще чтобы без СТЕ?

Угу. А селект-то писать можно?
24 авг 07, 11:53    [4571116]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
Гавриленко Сергей Алексеевич
ac86
А вот еще чтобы без СТЕ?

Угу. А селект-то писать можно?

ЖЖОТЕ
24 авг 07, 11:54    [4571125]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
ac86
Member

Откуда: СССР
Сообщений: 97
А Вы вместо того, чтобы смеятся лучше бы помогли.
24 авг 07, 11:54    [4571127]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
Glory
Member

Откуда:
Сообщений: 104760
ac86
А Вы вместо того, чтобы смеятся лучше бы помогли.

Ну возмите тогда книжку по теории баз данных и пересоздайте структуру таблицы согласно нормальеым формам. И не нужно будет использовать никаких переменных
24 авг 07, 11:57    [4571162]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
ac86
Member

Откуда: СССР
Сообщений: 97
Glory
ac86
А Вы вместо того, чтобы смеятся лучше бы помогли.

Ну возмите тогда книжку по теории баз данных и пересоздайте структуру таблицы согласно нормальеым формам. И не нужно будет использовать никаких переменных


БД имеет как минимум 3НФ, вот так.
24 авг 07, 11:59    [4571183]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
Glory
Member

Откуда:
Сообщений: 104760
ac86
Glory
ac86
А Вы вместо того, чтобы смеятся лучше бы помогли.

Ну возмите тогда книжку по теории баз данных и пересоздайте структуру таблицы согласно нормальеым формам. И не нужно будет использовать никаких переменных


БД имеет как минимум 3НФ, вот так.

И какой НФ соответствует ваша таблица ?
24 авг 07, 12:00    [4571197]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36829
ac86
Glory
ac86
А Вы вместо того, чтобы смеятся лучше бы помогли.

Ну возмите тогда книжку по теории баз данных и пересоздайте структуру таблицы согласно нормальеым формам. И не нужно будет использовать никаких переменных


БД имеет как минимум 3НФ, вот так.

Оно и видно.
24 авг 07, 12:01    [4571199]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
ac86
Member

Откуда: СССР
Сообщений: 97
Разве сейчас так важно какой НФ соответствует БД?

Мне просто нужна не большая помощь с написанием запроса, всего то...
24 авг 07, 12:09    [4571281]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36829
ac86
Разве сейчас так важно какой НФ соответствует БД?

Мне просто нужна не большая помощь с написанием запроса, всего то...

Уже дали два варианта, и ни одной причины, почему они не подходят в ответ.
24 авг 07, 12:10    [4571291]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
Glory
Member

Откуда:
Сообщений: 104760
ac86
Разве сейчас так важно какой НФ соответствует БД?

Мне просто нужна не большая помощь с написанием запроса, всего то...

Если вы ставите условия - без cte, без переменных и тд - то очень важно.
Нельзя решать задачи одним запросом на стуктурах, которые не соответствуют стандартам.
24 авг 07, 12:12    [4571325]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
ac86
Member

Откуда: СССР
Сообщений: 97
Гавриленко Сергей Алексеевич
ac86
Разве сейчас так важно какой НФ соответствует БД?

Мне просто нужна не большая помощь с написанием запроса, всего то...

Уже дали два варианта, и ни одной причины, почему они не подходят в ответ.


Не подходят потому, что нужно обойтись без использования переменных, временных таблиц, СТЕ.
24 авг 07, 12:12    [4571326]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
ac86
Разве сейчас так важно какой НФ соответствует БД?

Мне просто нужна не большая помощь с написанием запроса, всего то...


тогда только "безумный запрос" на всё возможное кол-во слов, для теста на 2 слова:

declare @t table (id int identity, name varchar(255))
insert into @t
select 'Киев'
union all
select 'Киев Моссква'
union all
select 'Киев Моссква Киев'
union all
select 'Киев Моссква Киев Киев Моссква Киев'
union all
select 'Киев Моссква'
union all
select 'Киев Моссква Киев';

select city from
(
select id, 1 flag, substring(name, 1, charindex(' ', name)) city from @t
union all
select id, 2, substring(stuff(name, 1, charindex(' ', name), ''), 1, 
charindex(' ', stuff(name, 1, charindex(' ', name), '')+' '))  from @t
)
t where city!='' order by id, flag 
24 авг 07, 12:12    [4571331]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
ac86
Member

Откуда: СССР
Сообщений: 97
Knyazev Alexey
ac86
Разве сейчас так важно какой НФ соответствует БД?

Мне просто нужна не большая помощь с написанием запроса, всего то...


тогда только "безумный запрос" на всё возможное кол-во слов, для теста на 2 слова:

declare @t table (id int identity, name varchar(255))
insert into @t
select 'Киев'
union all
select 'Киев Моссква'
union all
select 'Киев Моссква Киев'
union all
select 'Киев Моссква Киев Киев Моссква Киев'
union all
select 'Киев Моссква'
union all
select 'Киев Моссква Киев';

select city from
(
select id, 1 flag, substring(name, 1, charindex(' ', name)) city from @t
union all
select id, 2, substring(stuff(name, 1, charindex(' ', name), ''), 1, 
charindex(' ', stuff(name, 1, charindex(' ', name), '')+' '))  from @t
)
t where city!='' order by id, flag 


Спасибо. буду пробовать.
24 авг 07, 12:18    [4571394]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
ййййй
Guest
:)) ну если 2005 и пробел между словами 1

select 
chs.ch.value('@i', 'varchar(200)')
 from
  (select convert(xml, '<root><V i="'+replace(convert(varchar(max),(select name as 'data()' from @t for xml path (''))),' ','"/><V  i="') +'"/></root>')  r)t
cross apply r.nodes('/root/V') as  chs(ch)
24 авг 07, 12:57    [4571792]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
ййййй
:))

Отличная идея решения подобных задач!!! взял на вооружение
24 авг 07, 13:41    [4572097]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
ac86
Member

Откуда: СССР
Сообщений: 97
ййййй
:)) ну если 2005 и пробел между словами 1

select 
chs.ch.value('@i', 'varchar(200)')
 from
  (select convert(xml, '<root><V i="'+replace(convert(varchar(max),(select name as 'data()' from @t for xml path (''))),' ','"/><V  i="') +'"/></root>')  r)t
cross apply r.nodes('/root/V') as  chs(ch)


Большое спасибо.
24 авг 07, 14:12    [4572367]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
москит
Guest
ac86
Разве сейчас так важно какой НФ соответствует БД?


Соблюдение НФ нынче не в моде. :(
Эх, молодёжь.
24 авг 07, 14:17    [4572414]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
ну и в продалжение, выше озвученной идеи, вариант через элементы, а не через атрибуты:

select 
city=a.b.value('.', 'varchar(20)')
from (select xml=convert(xml,'<root><c>'+replace(
convert(varchar(max),(select name+' ' from @t for xml path('')))
, ' ', '</c><c>')+'</c></root>')) t 
cross apply xml.nodes('/root/c') a(b)
24 авг 07, 14:40    [4572607]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сооброзительость.  [new]
ййййй
Guest
только в этом случае лишняя пустая строка (поледняя) появляется:)
24 авг 07, 18:47    [4574244]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить