|   |   | 
| 
 | Помогите SQL запросом свернуть дубли | ☑ | ||
|---|---|---|---|---|
| 0
    
        Помогите 18.05.15✎ 06:50 | 
        Нужно найти все строки с дублирующимся полем, и в новое поле для всех этих строк присвоить значение идентификатора одной из строк.
 Например таблица: id поле1 0 Красный 1 Картошка 2 Карандаш 3 Красный 4 Два 5 Два 6 Два должна превратиться в такую таблицу: id поле1 НовоеПоле 0 Красный 0 1 Картошка 2 Карандаш 3 Красный 0 4 Два 4 5 Два 4 6 Два 4 В строку 0 и в строку 3 добавилось значение 0 в НовоеПоле, потому что 0 - это идентификатор одной из строк с дублирующимся значением "Красный" В строку 4, 5 и в строку 6 добавилось значение 4 в НовоеПоле, потому что 4 - это идентификатор одной из строк с дублирующимся значением "Два" В другие строки ничего не добавилось, т.к. там нет дублей. А теперь самое главное, вопрос: Как сделать такой запрос? | |||
| 1
    
        Помогите 18.05.15✎ 06:51 | 
        ЗЫ: MySQL     | |||
| 2
    
        фобка 18.05.15✎ 06:56 | 
        Первый запрос - простой select t.id, sum(1) group by t.id having sum(1) >1. Затем егоже иннер джойн между собой по id (так же как делают счетчик записей). Итоговый запрос left join с первой таблицей     | |||
| 3
    
        фобка 18.05.15✎ 07:01 | 
        Если есть счетчик записей то юзать его     | |||
| 4
    
        Помогите 18.05.15✎ 07:25 | 
        (2) Ничего не понял. 
 >> Первый запрос - простой select t.id, sum(1) group by t.id having sum(1) >1. выдаст пустой результат, потому что id уникальный, sum(1)=1 всегда. >> егоже иннер джойн между собой по id Что это даст кроме удваивания столбцов? | |||
| 5
    
        фобка 18.05.15✎ 08:03 | ||||
| 6
    
        Помогите 18.05.15✎ 08:24 | 
        (5) Наверное ты не правильно понял мою задачу.     | |||
| 7
    
        фобка 18.05.15✎ 08:24 | 
        (6) нет, я все понял верно     | |||
| 8
    
        фобка 18.05.15✎ 08:26 | 
        (4) первый запрос, назовем его вложенный1 выдаст
 Красный Два | |||
| 9
    
        фобка 18.05.15✎ 08:29 | 
        Чтобы пронумеровать его нужно его заджойнить с самим собой по т1.ид<=т2.ид. 
 Но если есть метод типа rownumber() логичнее использовать его. | |||
| 10
    
        фобка 18.05.15✎ 08:30 | 
        Третьим действием ты исходную таблицу соединяешь с тем что получилось в (9) чтобы выцепить счетчик строк     | |||
| 11
    
        Помогите 18.05.15✎ 08:37 | 
        Мне не надо ничего нумеровать     | |||
| 12
    
        Помогите 18.05.15✎ 08:38 | 
        Но в общем я твою мысль понимаю     | |||
| 13
    
        dk 18.05.15✎ 08:46 | 
        select
 Id , Поле1 , Влож.ID from исходные left join (select min(ID) Поле1 from исходные group by Поле1) влож | |||
| 14
    
        dk 18.05.15✎ 08:54 | 
        select 
 Id , Поле1 , Влож.ID from исходные left join (select min(ID) Поле1 from исходные group by Поле1) влож ON Поле1 = Влож.Поле1 | |||
| 15
    
        mehfk 18.05.15✎ 08:57 | 
        (0) Напиши аналогичный запрос на языке запросов 1С, переведи промтом.     | |||
| 16
    
        фобка 18.05.15✎ 08:58 | 
        (11) тогда все проще 
 Select t.name, t2.id from t as t left join (Select t.name, t.id group by t.name, t.id having sum1) >1) as t2 on t.name = t2.name | |||
| 17
    
        фобка 18.05.15✎ 08:58 | 
        Having sum(1)>1     | |||
| 18
    
        Помогите 18.05.15✎ 09:00 | 
        Ага, спасибо. Самое то.     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |