-
Имеется таблица вида: 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
-
MS SQL Server 2005
-
where and v.nomer = v1.nomer and v.id < v1.id
-
Супер! Спасибо!
...p.s. и как просто...
-
select Nomer
from test
group by Nomer
Having count(*) >1 вроде так
-
> Ega23 © (29.09.08 15:51) [4]
а ID шники?
-
> а ID шники?
Select ID, Nomer from Table where Nomer in (тут мой запрос).
-
> Ega23 © (29.09.08 16:00) [6]
А потом приложению придеться сопоставлять IDшники номерам.
-
> А потом приложению придеться сопоставлять IDшники номерам.
Не понял? Select ID, Nomer from test where Nomer in
(
select Nomer
from test
group by Nomer
Having count(*) >1
) Ты получил НД, в котором представлены все id и номера из повторяющихся номеров.
-
> Не понял?
Понял... ты получишь 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
-
> А автор хотел
пипец. А если их три номера одинаковых??? А если пятнадцать?
-
Автор что хотел - то и получил. А нам не известно может быть такое по логике или нет. И если может, то как это надо представить.
-
> А нам не известно может быть такое по логике или нет.
Ну, по крайней мере, классический запрос на получение повторяющихся значений выглядит именно так, как в [4]. На собеседованиях, бывает, спрашивают. Имей ввиду.
-
> классический запрос
Вызывает сомнения, честное слово. Например тут написано: http://ibase.ru/devinfo/dontdoit.htm > Не рекомендуется употреблять подзапросы в списочном контексте, > то есть in (...), =all(...), =some(...). > оптимизатор раскладывает FIELD IN (X, Y) в FIELD = X or > FIELD = Y, соответственно чем больше элементов в IN, тем > больше проверок приходится делать, и тем медленнее все это > выполняется. Подумайте, может быть удастся заменить IN явным > или неявным JOIN.
* Это касается FireBird-а. В других - не знаю.
-
> Не рекомендуется употреблять подзапросы в списочном контексте,
Где ты в [4] видишь подзапрос?
-
Ответ [4] самый правильный (если можно так сказать) на вопрос "Нужно узнать совпадающие номера".
-
> самый правильный
Каждый прав лишь в том, что другой неправ.
> Ega23 © (29.09.08 19:53) [14]
Может быть, только он не решает поставленную автором задачу.
> На собеседованиях, бывает, спрашивают. Имей ввиду.
Нашел пионера :)
-
> [9] Dmitry S © (29.09.08 16: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
Да, конечно, конечная цель - сравнить именно Id (и прочие поля)
> [10] Ega23 © (29.09.08 16:27) > > > А автор хотел > > пипец. А если их три номера одинаковых??? А если пятнадцать?
Вот 3 бывает, но редко. Но будь даже 15, хорошо, нужно-то видеть не то что баг имеет место, а как его устранить, т.е. пресловутые ошибочные Id. Значит надо показать все 15. Может есть способ сделать это из [4] ?
> [15] Johnmen © (29.09.08 20:08)
Век живи-век учись. Возможно, мне следовало более четко формулировать вопрос :)
-
> видеть не то что баг имеет место, а как его устранить, уникальный индекс на поле, и никаких проблем с дублированием...
-
> [18] sniknik © (29.09.08 22:37) > > видеть не то что баг имеет место, а как его устранить, > > уникальный индекс на поле, и никаких проблем с дублированием...
Все не так просто. Сущствует список разрешенных, "законных" совпадений. Он дописывается в запросе, навроде 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
and v.nomer not in (
.....
)
|