-
Имеется таблица вида: 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 (
.....
)
-
> Сущствует список разрешенных, "законных" вынести "законные" совпадения в отдельную таблицу... таблица "законных" совпадений будет состоять из номера, и порядка (в нем позиция в который раз оно совпадает) пример основная таблица 1 2 3 4 5 допустим 2 совпадает 2 раза, 4 три тогда в таблице совпадений будет 2 1 2 2 4 1 4 2 4 3 (второе поле, можно просто автоинкремент) объединять будеш также но не само с собой а разные таблицы.
-
> [20] sniknik © (29.09.08 23:11)
Хорошо, но не совсем понятен смысл всего этого. Ведь приведенный запрос - лишь схема. Реально, кроме id и номера сущесвуют другие поля. Их-то в таком случае где хранить?
Если мы принимаем, что в основной табллице номер- уникальное поле, то в случае совпадения номеров даные этой записи отправляются во вспомогательную таблицу - суть дублирующая структуру исходной таблицы + содежащая поле количества совпадений....
...или я что-то неправильно понял?
-
А кроме того, эти совпадения - баг не только программного и информационного обеспечения, а... как бы это сказать... бумажного обеспечения :))))
т.к. в принципе, таких совпадений должно становится все меньше, и в конечном итоге (лет через ...цать), вовсе остаться не должно.
-
> Ведь приведенный запрос - лишь схема. для схемы я и привел решение.
> т.к. в принципе, таких совпадений должно становится > все меньше, и в конечном итоге (лет через ...цать), > вовсе остаться не должно. ни разу не видел человека бросившего курить поэтапно, типа сегодня на одну затяжку меньше чем вчера, а завтра меньше чем сегодня, и т.д. через полгода в планах удет ни одной... если и бросают, то сразу, с перебарыванием себя. с бардаком думаю ситуация примерно та же...
> как бы это сказать... бумажного обеспечения :)))) вот в бумагах тогда пусть дубли и ведут, дописывают к твоему номеру тот который по их мнению верный хотя и дубль, а у тебя будет правильно. в этом случае путаница в номерах будет не на тебе, а на их ответственности, и будет их головная боль... и все быстро "саморазрешиться" уверяю тебя. главное правильно донести идею до начальства, с четкой постановкой "или бардак навсегда, или надо чтото делать, я вот предлагаю... а программированием бардака. бардак не исправишь".
-
> sniknik © (30.09.08 00:30) [23] > > ни разу не видел человека бросившего курить поэтапно, типа > сегодня на одну затяжку меньше чем вчера, а завтра меньше > чем сегодня, и т.д. через полгода в планах удет ни одной. > .. > если и бросают, то сразу, с перебарыванием себя.
Мал жизненный опыт. Ты не поверишь как много таких людей. Поверь только, что "все люди разные, но у них встречаются общие черты". :)
-
> sniknik (30.09.2008 0:30:23) [23]
Я - сначала не курил 6 часов, на другой день не курил совсем и без перебарывания, нечего там перебарывать.
-
> sniknik (30.09.2008 0:30:23) [23]
А на предлажение - ты мол подумай, сразу отрезать с формулировкой "Бардак не автоматизируется"
-
> А на предлажение - ты мол подумай, сразу отрезать с формулировкой > "Бардак не автоматизируется"
Так-то оно так. До тех пор, пока "Бардак" не узаконивается... :(
-
Kostafey © (29.09.08 22:21) [17] тебе нужна сводная таблица. В строках ID в столбцах NOMER, на пересечении единичка.
-
> Ega23 © (30.09.08 12:59) [27]
бардак-в-законе тоже не автоматизируется если ты что-то подобное видел или слышал, то это был эмулятор
-
> бардак-в-законе тоже не автоматизируется
Ещё как. Но геморно...
-
> Но геморно...
т.е. это первманентный процесс, который никогда не будет доведен до конца, т.е. совершенная форма глагола к нему не может быть применена только герундий....
-
> [28] stas © (30.09.08 16:11) > Kostafey © (29.09.08 22:21) [17] > тебе нужна сводная таблица. В строках ID в столбцах NOMER, > на пересечении единичка.
Не вижу в этом смысла. Зачем?
> [30] Ega23 © (30.09.08 16:55)
+1
-
Kostafey © (30.09.08 22:30) [32] Тогда непонятна цель твоего запроса.
|