Конференция "Базы" » Помогите с 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 (
    .....
    )

 
Конференция "Базы" » Помогите с SQL запросом поиска совпадений
Есть новые Нет новых   [134473   +28][b:0][p:0.001]