Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2009.06.28;
Скачать: [xml.tar.bz2];

Вниз

Помогите с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.005 c
4-1211700081
LightRipple
2008-05-25 11:21
2009.06.28
OPEN_IF для секции


15-1240336721
v1keeee
2009-04-21 21:58
2009.06.28
Прошу совета по переделки интерфейса


15-1240591691
Kolan
2009-04-24 20:48
2009.06.28
«Интерфейс пользователя» &amp;#8594; Интерфейсная справка


15-1240316904
12
2009-04-21 16:28
2009.06.28
tsql. sql2000. Из хранимки узнать имя вызвавшей хранимки


9-1180224380
TTerrain
2007-05-27 04:06
2009.06.28
Сфероид на поверхности Как его разместить равноудалённым от конта





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский