Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.06.28;
Скачать: CL | DM;

Вниз

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

 
Kostafey ©   (2008-09-29 15:39) [0]

Имеется таблица вида:
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


 
Kostafey ©   (2008-09-29 15:42) [1]

MS SQL Server 2005


 
Dmitry S ©   (2008-09-29 15:45) [2]

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


 
Kostafey ©   (2008-09-29 15:50) [3]

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

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


 
Ega23 ©   (2008-09-29 15:51) [4]

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


вроде так


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


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

а ID шники?


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


> а ID шники?


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


 
Dmitry S ©   (2008-09-29 16:03) [7]


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

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


 
Ega23 ©   (2008-09-29 16:09) [8]


> А потом приложению придеться сопоставлять 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:25) [9]


> Не понял?

Понял... ты получишь
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:27) [10]


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


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


 
Dmitry S ©   (2008-09-29 17:14) [11]

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


 
Ega23 ©   (2008-09-29 17:26) [12]


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


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


 
Dmitry S ©   (2008-09-29 19:41) [13]


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

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

Например тут написано:
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 19:53) [14]


> Не рекомендуется употреблять подзапросы в списочном контексте,


Где ты в [4] видишь подзапрос?


 
Johnmen ©   (2008-09-29 20:08) [15]

Ответ [4] самый правильный (если можно так сказать) на вопрос "Нужно узнать совпадающие номера".


 
Дмитрий_С   (2008-09-29 22:05) [16]


> самый правильный

Каждый прав лишь в том, что другой неправ.


> Ega23 ©   (29.09.08 19:53) [14]

Может быть, только он не решает поставленную автором задачу.


> На собеседованиях, бывает, спрашивают. Имей ввиду.

Нашел пионера :)


 
Kostafey ©   (2008-09-29 22:21) [17]

> [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)

Век живи-век учись. Возможно, мне
следовало более четко формулировать вопрос :)


 
sniknik ©   (2008-09-29 22:37) [18]

> видеть не то что баг имеет место, а как его устранить,
уникальный индекс на поле, и никаких проблем с дублированием...


 
Kostafey ©   (2008-09-29 22:57) [19]

> [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 (
.....
)


 
sniknik ©   (2008-09-29 23:11) [20]

> Сущствует список разрешенных, "законных"
вынести "законные" совпадения в отдельную таблицу...
таблица "законных" совпадений будет состоять из номера, и порядка (в нем позиция в который раз оно совпадает)
пример
основная таблица
1
2
3
4
5
допустим 2 совпадает 2 раза, 4 три
тогда в таблице совпадений будет
2  1
2  2
4  1
4  2
4  3
(второе поле, можно просто автоинкремент)
объединять будеш также но не само с собой а разные таблицы.


 
Kostafey ©   (2008-09-29 23:48) [21]

> [20] sniknik ©   (29.09.08 23:11)

Хорошо, но не совсем понятен смысл всего этого.
Ведь приведенный запрос - лишь схема.
Реально, кроме id и номера сущесвуют другие поля.
Их-то в таком случае где хранить?

Если мы принимаем, что в основной табллице номер-
уникальное поле, то в случае совпадения номеров
даные этой записи отправляются во вспомогательную
таблицу - суть дублирующая структуру исходной таблицы +
содежащая поле количества совпадений....

...или я что-то неправильно понял?


 
Kostafey ©   (2008-09-29 23:53) [22]

А кроме того, эти совпадения - баг не только
программного и информационного обеспечения, а...
как бы это сказать... бумажного обеспечения :))))

т.к. в принципе, таких совпадений должно становится
все меньше, и в конечном итоге (лет через ...цать),
вовсе остаться не должно.


 
sniknik ©   (2008-09-30 00:30) [23]

> Ведь приведенный запрос - лишь схема.
для схемы я и привел решение.

> т.к. в принципе, таких совпадений должно становится
> все меньше, и в конечном итоге (лет через ...цать),
> вовсе остаться не должно.
ни разу не видел человека бросившего курить поэтапно, типа сегодня на одну затяжку меньше чем вчера, а завтра меньше чем сегодня, и т.д. через полгода в планах удет ни одной...
если и бросают, то сразу, с перебарыванием себя.
с бардаком думаю ситуация примерно та же...

> как бы это сказать... бумажного обеспечения :))))
вот в бумагах тогда пусть дубли и ведут, дописывают к твоему номеру тот который по их мнению верный хотя и дубль, а у тебя будет правильно.
в этом случае путаница в номерах будет не на тебе, а на их ответственности, и будет их головная боль...  и все быстро "саморазрешиться" уверяю тебя.
главное правильно донести идею до начальства, с четкой постановкой "или бардак навсегда, или надо чтото делать, я вот предлагаю... а программированием бардака. бардак не исправишь".


 
Германн ©   (2008-09-30 01:30) [24]


> sniknik ©   (30.09.08 00:30) [23]
>
> ни разу не видел человека бросившего курить поэтапно, типа
> сегодня на одну затяжку меньше чем вчера, а завтра меньше
> чем сегодня, и т.д. через полгода в планах удет ни одной.
> ..
> если и бросают, то сразу, с перебарыванием себя.

Мал жизненный опыт.
Ты не поверишь как много таких людей. Поверь только, что "все люди разные, но у них встречаются общие черты". :)


 
Anatoly Podgoretsky ©   (2008-09-30 12:03) [25]

> sniknik  (30.09.2008 0:30:23)  [23]

Я - сначала не курил 6 часов, на другой день не курил совсем и без перебарывания, нечего там перебарывать.


 
Anatoly Podgoretsky ©   (2008-09-30 12:05) [26]

> sniknik  (30.09.2008 0:30:23)  [23]

А на предлажение - ты мол подумай, сразу отрезать с формулировкой "Бардак не автоматизируется"


 
Ega23 ©   (2008-09-30 12:59) [27]


> А на предлажение - ты мол подумай, сразу отрезать с формулировкой
> "Бардак не автоматизируется"


Так-то оно так. До тех пор, пока "Бардак" не узаконивается...  :(


 
stas ©   (2008-09-30 16:11) [28]

Kostafey ©   (29.09.08 22:21) [17]
тебе нужна сводная таблица. В строках ID  в столбцах NOMER, на пересечении единичка.


 
Правильный$Вася   (2008-09-30 16:21) [29]


> Ega23 ©   (30.09.08 12:59) [27]

бардак-в-законе тоже не автоматизируется
если ты что-то подобное видел или слышал, то это был эмулятор


 
Ega23 ©   (2008-09-30 16:55) [30]


> бардак-в-законе тоже не автоматизируется


Ещё как. Но геморно...


 
Правильный$Вася   (2008-09-30 17:01) [31]


>  Но геморно...

т.е. это первманентный процесс, который никогда не будет доведен до конца, т.е. совершенная форма глагола к нему не может быть применена
только герундий....


 
Kostafey ©   (2008-09-30 22:30) [32]

> [28] stas ©   (30.09.08 16:11)
> Kostafey ©   (29.09.08 22:21) [17]
> тебе нужна сводная таблица. В строках ID  в столбцах NOMER,
> на пересечении единичка.

Не вижу в этом смысла. Зачем?


> [30] Ega23 ©   (30.09.08 16:55)

+1


 
stas ©   (2008-10-01 08:54) [33]

Kostafey ©   (30.09.08 22:30) [32]
Тогда непонятна цель твоего запроса.



Страницы: 1 вся ветка

Текущий архив: 2009.06.28;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.01 c
15-1240900857
LiveCD
2009-04-28 10:40
2009.06.28
Выбор ОС


15-1239784299
Kolan
2009-04-15 12:31
2009.06.28
«Интерфейс пользователя» &amp;#8594; Сетка в таблицах


3-1222915555
Татьяна
2008-10-02 06:45
2009.06.28
Lookup поля в таблицах.


6-1204126047
rar
2008-02-27 18:27
2009.06.28
IdFTP


15-1240326297
12
2009-04-21 19:04
2009.06.28
«Интерфейс пользователя» Идентификация