![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с SQL запросом поиска совпадений
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