Конференция "Базы" » Помогите с SQL запросом поиска совпадений
 
  • Kostafey © (29.09.08 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 © (29.09.08 15:42) [1]
    MS SQL Server 2005
  • Dmitry S © (29.09.08 15:45) [2]
    where
    and v.nomer = v1.nomer        
    and v.id < v1.id
  • Kostafey © (29.09.08 15:50) [3]
    Супер!
    Спасибо!

    ...p.s. и как просто...
  • Ega23 © (29.09.08 15:51) [4]
    select Nomer
    from test
    group by Nomer
    Having count(*) >1



    вроде так
  • Dmitry S © (29.09.08 15:58) [5]

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

    а ID шники?
  • Ega23 © (29.09.08 16:00) [6]

    > а ID шники?


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

  • Dmitry S © (29.09.08 16:03) [7]

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

    А потом приложению придеться сопоставлять IDшники номерам.
  • Ega23 © (29.09.08 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 © (29.09.08 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 © (29.09.08 16:27) [10]

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


    пипец. А если их три номера одинаковых??? А если пятнадцать?
  • Dmitry S © (29.09.08 17:14) [11]
    Автор что хотел - то и получил. А нам не известно может быть такое по логике или нет. И если может, то как это надо представить.
  • Ega23 © (29.09.08 17:26) [12]

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


    Ну, по крайней мере, классический запрос на получение повторяющихся значений выглядит именно так, как в [4].
    На собеседованиях, бывает, спрашивают. Имей ввиду.
  • Dmitry S © (29.09.08 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 © (29.09.08 19:53) [14]

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


    Где ты в [4] видишь подзапрос?
  • Johnmen © (29.09.08 20:08) [15]
    Ответ [4] самый правильный (если можно так сказать) на вопрос "Нужно узнать совпадающие номера".
  • Дмитрий_С (29.09.08 22:05) [16]

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

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


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

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


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

    Нашел пионера :)
  • Kostafey © (29.09.08 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 © (29.09.08 22:37) [18]
    > видеть не то что баг имеет место, а как его устранить,
    уникальный индекс на поле, и никаких проблем с дублированием...
  • Kostafey © (29.09.08 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 © (29.09.08 23:11) [20]
    > Сущствует список разрешенных, "законных"
    вынести "законные" совпадения в отдельную таблицу...
    таблица "законных" совпадений будет состоять из номера, и порядка (в нем позиция в который раз оно совпадает)
    пример
    основная таблица
    1
    2
    3
    4
    5
    допустим 2 совпадает 2 раза, 4 три
    тогда в таблице совпадений будет
    2  1
    2  2
    4  1
    4  2
    4  3
    (второе поле, можно просто автоинкремент)
    объединять будеш также но не само с собой а разные таблицы.
  • Kostafey © (29.09.08 23:48) [21]
    > [20] sniknik ©   (29.09.08 23:11)

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

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

    ...или я что-то неправильно понял?
  • Kostafey © (29.09.08 23:53) [22]
    А кроме того, эти совпадения - баг не только
    программного и информационного обеспечения, а...
    как бы это сказать... бумажного обеспечения :))))

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

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

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

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

    Мал жизненный опыт.
    Ты не поверишь как много таких людей. Поверь только, что "все люди разные, но у них встречаются общие черты". :)
  • Anatoly Podgoretsky © (30.09.08 12:03) [25]
    > sniknik  (30.09.2008 0:30:23)  [23]

    Я - сначала не курил 6 часов, на другой день не курил совсем и без перебарывания, нечего там перебарывать.
  • Anatoly Podgoretsky © (30.09.08 12:05) [26]
    > sniknik  (30.09.2008 0:30:23)  [23]

    А на предлажение - ты мол подумай, сразу отрезать с формулировкой "Бардак не автоматизируется"
  • Ega23 © (30.09.08 12:59) [27]

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


    Так-то оно так. До тех пор, пока "Бардак" не узаконивается...  :(
  • stas © (30.09.08 16:11) [28]
    Kostafey ©   (29.09.08 22:21) [17]
    тебе нужна сводная таблица. В строках ID  в столбцах NOMER, на пересечении единичка.
  • Правильный$Вася (30.09.08 16:21) [29]

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

    бардак-в-законе тоже не автоматизируется
    если ты что-то подобное видел или слышал, то это был эмулятор
  • Ega23 © (30.09.08 16:55) [30]

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


    Ещё как. Но геморно...
  • Правильный$Вася (30.09.08 17:01) [31]

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

    т.е. это первманентный процесс, который никогда не будет доведен до конца, т.е. совершенная форма глагола к нему не может быть применена
    только герундий....
  • Kostafey © (30.09.08 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 © (01.10.08 08:54) [33]
    Kostafey ©   (30.09.08 22:30) [32]
    Тогда непонятна цель твоего запроса.
 
Конференция "Базы" » Помогите с SQL запросом поиска совпадений
Есть новые Нет новых   [134444   +21][b:0][p:0.002]