Форум: "Базы";
Текущий архив: 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.53 MB
Время: 0.005 c