|
Помогите 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
|
Ага, спасибо. Самое то.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |