Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с SQL запросом поиска совпадений


Страницы:   1 2

Kostafey ©   (2008-09-29 15:39:00) 

Имеется таблица вида:
Table1
id Nomer
1  001
2  002
3  002
4  001

Нужно узнать совпадающие номера

select distinct *
 v.id, v.nomer,
 v1.id, v1.nomer
from
 Table1 v,
 Table1 v1
where
 and v.nomer = v1.nomer        
 and v.id != v1.id


Получим:
v.id v.Nomer   v1.id v1,nomer
1    001         4    001
2    002         3    002
3    002         2    002
4    001         1    001

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

v.id v.Nomer   v1.id v1,nomer
1    001         4    001
2    002         3    002


Dmitry S   (2008-09-29 19:41:00) [21]


> классический запрос

Вызывает сомнения, честное слово.

Например тут написано:
http://ibase.ru/devinfo/dontdoit.htm

> Не рекомендуется употреблять подзапросы в списочном контексте,
>  то есть in (...), =all(...), =some(...).
> оптимизатор раскладывает FIELD IN (X, Y) в FIELD = X or
> FIELD = Y, соответственно чем больше элементов в IN, тем
> больше проверок приходится делать, и тем медленнее все это
> выполняется. Подумайте, может быть удастся заменить IN явным
> или неявным JOIN.

* Это касается FireBird-а. В других - не знаю.


Ega23   (2008-09-29 17:26:00) [22]


> А нам не известно может быть такое по логике или нет.


Ну, по крайней мере, классический запрос на получение повторяющихся значений выглядит именно так, как в [4].
На собеседованиях, бывает, спрашивают. Имей ввиду.


Dmitry S   (2008-09-29 17:14:00) [23]

Автор что хотел - то и получил. А нам не известно может быть такое по логике или нет. И если может, то как это надо представить.


Ega23   (2008-09-29 16:27:00) [24]


> А автор хотел


пипец. А если их три номера одинаковых??? А если пятнадцать?


Dmitry S   (2008-09-29 16:25:00) [25]


> Не понял?

Понял... ты получишь
id Nomer
1    001        
4    001
2    002        
3    002


А автор хотел
v.id v.Nomer   v1.id v1,nomer
1    001         4    001
2    002         3    002


Ega23   (2008-09-29 16:09:00) [26]


> А потом приложению придеться сопоставлять IDшники номерам.


Не понял?

Select ID, Nomer from test where Nomer in
 (
   select Nomer
   from test
   group by Nomer
   Having count(*) >1
 )


Ты получил НД, в котором представлены все id и номера из повторяющихся номеров.


Dmitry S   (2008-09-29 16:03:00) [27]


> Ega23 ©   (29.09.08 16:00) [6]

А потом приложению придеться сопоставлять IDшники номерам.


Ega23   (2008-09-29 16:00:00) [28]


> а ID шники?


Select ID, Nomer from Table where Nomer in (тут мой запрос).


Dmitry S   (2008-09-29 15:58:00) [29]


> Ega23 ©   (29.09.08 15:51) [4]

а ID шники?


Ega23   (2008-09-29 15:51:00) [30]

select Nomer
from test
group by Nomer
Having count(*) >1


вроде так


Kostafey   (2008-09-29 15:50:00) [31]

Супер!
Спасибо!

...p.s. и как просто...


Dmitry S   (2008-09-29 15:45:00) [32]

where
and v.nomer = v1.nomer        
and v.id < v1.id


Kostafey   (2008-09-29 15:42:00) [33]

MS SQL Server 2005


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо