Поиск совпадений в MSSQL базе

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Поиск совпадений в MSSQL базе

Сообщение MIT » 19.08.2009 (Ср) 0:17

Есть простенькая таблица, содержащая в себе два столбца: IDENTITY и VARCHAR (на самом деле их больше, но сейчас это не важно). Необходимо каким-то образом найти совпадения значений столбца VARCHAR, пр этом получив идентификаторы для последующей обработки (в идеале двухмерный массив совпадений, но, насколько я знаю, это невозможно).
Т.е. вот примерное содержание таблицы:
Код: Выделить всё
1    str1
2    str2
3    str3
4    str4
5    str5
7    str49
10   str70
11   str2
15   str2
22   str5

Хотелось бы получить данные в таком виде:
2, 11, 15
5, 22

Насколько это возможно? Если это хоть каким-нибудь образом возможно, то как реализовать?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Поиск совпадений в MSSQL базе

Сообщение HandKot » 19.08.2009 (Ср) 8:13

все зависит от версии базы данных

для 2005 можно предложить такой вариант
Код: Выделить всё
select distinct
  fld,
  (select cast(t1.id as varchar(10)) + ', ' from #MyTable t1 where t1.fld = t.fld for xml path ('') )
from
  #MyTable t


вот тут посмотрите возможные варианты для разных версий
I Have Nine Lives You Have One Only
THINK!

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Поиск совпадений в MSSQL базе

Сообщение MIT » 19.08.2009 (Ср) 12:08

Версия - 2008.

Товарищ iGrok проконсультировал меня по ICQ и предложил вот такой вариант:
Код: Выделить всё
SELECT [id_val], [varchar_val]
FROM [table]
WHERE [varchar_val] IN (
  SELECT [varchar_val] FROM [table] GROUP BY varchar_val HAVING COUNT(*) > 1 )
ORDER BY varchar_val

Вроде все работает, результат примерно ожидаемый, обработать не сложно.

Твой запрос попозже попробую.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Поиск совпадений в MSSQL базе

Сообщение HandKot » 19.08.2009 (Ср) 13:37

при 2008 для получения результата, указанного в посте, использовать либо FOR XML, либо CTE, либо можно извратнутся и написать свой USER DEFINE AGREGAT
I Have Nine Lives You Have One Only
THINK!

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Поиск совпадений в MSSQL базе

Сообщение SLIM » 19.08.2009 (Ср) 21:12

Может я не так понял, но то что тут предложили не то.
Ему нужна именно похожая на матрицу структура. Следует конечно ее дополнить, но все равно. Тут, по моему, без динамичного запроса не обойтись.
Или я не так понял?
Пишите жизнь на чистовик.....переписать не удастся.....

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Поиск совпадений в MSSQL базе

Сообщение MIT » 19.08.2009 (Ср) 21:48

Ну, на самом деле, матричная структура была придумана мной как идеальный, но далеко не обязательный вариант получения данных, ведь обрабатываться они будут программно, а не на стороне SQL сервера.
Впрочем, если есть более элегантный способ, то, думаю, можно и его будет рассмотреть.

HandKot, еще не проверял...
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Поиск совпадений в MSSQL базе

Сообщение SLIM » 19.08.2009 (Ср) 22:04

Просто понимаешь, матрицу ты можешь выкрутить сведя данные.
Можно получить список типа
Код: Выделить всё
номер   |  совпадение
----------------------------
1                      102
1                      103
1                       5
2                       105
2                       100


И т.д. А потом группировать как нужно. Программно тем более просто.
Ну а сам запрос тебе уже подсказали.
Пишите жизнь на чистовик.....переписать не удастся.....

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Поиск совпадений в MSSQL базе

Сообщение iGrok » 19.08.2009 (Ср) 22:18

SLIM писал(а):Может я не так понял, но то что тут предложили не то.
Ему нужна именно похожая на матрицу структура. Следует конечно ее дополнить, но все равно. Тут, по моему, без динамичного запроса не обойтись.
Или я не так понял?

Вопрос в том, зачем оно надо. Если просто выявить совпадения и получить IDшники записей - то катит и мой вариант.
Причём катит на любом диалккте, а не только на mssql.

Если что-то другое, и нужно именно получать строку со списком ID - тогда, конечно, да..

З.Ы. А с последним предложенным SLIM вариантом, ИМХО, наоборот неудобно работать. Но это опять же зависит от целей. Если цель - считать основной записью первую по (какому-либо критерию), а со всеми остальными что-то делать - тогда рулит как раз его вариант.

З.З.Ы. Ну а вариант HandKot как раз наиболее полно соответствует ТЗ, описанному в первом посте. ) Правда, я так понял, что само ТЗ было не совсем корректно описано.. )
label:
cli
jmp label

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Поиск совпадений в MSSQL базе

Сообщение HandKot » 20.08.2009 (Чт) 7:26

но если нужна матрица, то тогда можно использовать PIVOT + ROWNUMBER
в результате получим таблицу

name id1 id2 id3 ... idN


с переменным количеством столбцов

Ну, на самом деле, матричная структура была придумана мной как идеальный, но далеко не обязательный вариант получения данных, ведь обрабатываться они будут программно, а не на стороне SQL сервера.
Впрочем, если есть более элегантный способ, то, думаю, можно и его будет рассмотреть.


если же обработку будете проводить на стороне клиента, то тогда просто
Код: Выделить всё
select * from MyTable order by name

и бежать в цикле по записям на клиенте
I Have Nine Lives You Have One Only
THINK!


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29

    TopList