Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Повторяющиеся значения


Страницы:   1 2

AlexanderSK ©   (2003-06-04 11:58:00) 

Есть ClientDataSet в нем табличка (несколько полей). Существуют по несколько записей с одинаковыми значениями в одном из полей. Как оптимальней получить табличку в которой отсутствуют повторения по этому полю?

Заранее спасибо!


интересующийся   (2003-06-04 15:24:00) [1]

автор ушел и ему уже ничего не нужно -)


Zacho   (2003-06-04 15:21:00) [2]

Еще одна непонятка: из нескольких записей оставить одну. Какую ? По какому критерию ? Случайно ? Что это за задача такая, в которой неважно, какие именно данные оставить, а какие - удалить ?


интересующийся   (2003-06-04 15:19:00) [3]

ЕСЛИ я правильно понял
сначала нужны все данные, а потом только отфильрованные по
уникальному f1 (как писал автор f2 & f3 роли не играют)
при этом запрос к БД должен быть только один

AlexanderSK ©, может вы уточните?


Zacho   (2003-06-04 15:12:00) [4]

Я что-то вообще понять не могу: причем здесь DISTINCT ?
Ведь одинаковые значения только в одномиз полей записей. И к тому же сначало они нужны все.
Поэтому, imho, все же более правильно сначало вытащить все необходимые записи, а после их обработки - отфильтровать на клиенте. Зачем второй раз перезапрашивать ?


интересующийся   (2003-06-04 15:11:00) [5]

если в t1 не должно быть дублирования данных
то можно сделать так (ms sql):
SELECT t1.f1, t1.f2, t1.f3, cf4 = case when t1.f1=t2.f1 then 1 else 0 end
from t1 left join
(SELECT f1, min(f2) as f2, min(f3) as f3 from t1 group by f1) as t2 on t1.f1 = t2.f1 and t1.f2 = t2.f2 and t1.f3 = t2.f3
order by t1.f1

у меня вышло
f1 f2 f3 cf4
----------- ----------- ----------- -----------
1 2 3 1
1 3 4 0
2 4 5 1
2 5 6 0
3 6 7 1

а дальше как предлагал Polevi - фильтровать


Sandman25   (2003-06-04 14:59:00) [6]

Johnmen © (04.06.03 14:55)

А мне обида понятна. Он привел одно из самых эффективных решений данной задачи. Но и Вы правы тоже - не стоит тащить все данные на клиента для дальнейшей фильтрации.


Johnmen   (2003-06-04 14:55:00) [7]

>Polevi © (04.06.03 14:45)

Мне почему-то чувствуется некая, непонятная мне, обида в твоем посте...
И еще мне не совсем ясно, зачем приводить ответы, идеологически направляющие не в ту сторону ? (Хоть и помогающие (извративщись) решить задачу)...


интересующийся   (2003-06-04 14:52:00) [8]

Johnmen
тем более чел писал, что
>В том-то и состоит весь фокус, что мне нужны все данные! Но на >определенном этапе работы с ними не нужны повторения! А >запрашивать 2 раза сервер неприемлемо!

AlexanderSK
а можно поинтересоваться какая БД?


интересующийся   (2003-06-04 14:47:00) [9]

Sandman25
а если и другие записи тоже нужны,
но в определенный момент только уникальные по F1?

Johnmen
Зря ведь Polevi дело пишет, только делать
это надо на сервере (т.е. в запросе)





Polevi   (2003-06-04 14:45:00) [10]

2Johnmen © (04.06.03 14:35)
вы дали совет
я дал ответ на вопрос

>А способов, особенно извращенческих, можно напридумывать множество...:)

- желаю удачи


Johnmen   (2003-06-04 14:35:00) [11]

>Polevi © (04.06.03 14:07)

А способов, особенно извращенческих, можно напридумывать множество...:)


Sandman25   (2003-06-04 14:11:00) [12]

AlexanderSK © (04.06.03 13:09)

Тем более нечего зря всю таблицу перекачивать. select distinct


Polevi   (2003-06-04 14:07:00) [13]

создай в датасете internalcalc поле Z, пробегись по датасету, при первом значении поля записывай в Z 1, при повторных - 0
дальше
Dataset.Filter("Z=1")
Dataset.Filtered:=true;


AlexanderSK   (2003-06-04 13:09:00) [14]

>needle
Сервер-то не перетрудиться! А вот данные-то через Internet предаються....


needle   (2003-06-04 12:59:00) [15]

>AlexanderSK не перетрудится твой сервер, не боись :-)


Johnmen   (2003-06-04 12:53:00) [16]

>AlexanderSK © (04.06.03 12:44)

Нет. "перезапросив".


AlexanderSK   (2003-06-04 12:44:00) [17]

А можно это сделать как нибудь в клиентском приложениии, когда данные уже получены? Или только "перезапросив" сервер?


Sandman25   (2003-06-04 12:32:00) [18]

Если без разницы, то select distinct f1 from t1 :)
А если уж очень хочется что-нибудь показать, то можно
select f1, min(f2), min(f3) from t1 group by f1


needle   (2003-06-04 12:29:00) [19]

> AlexanderSK
а ты попроси пользователя отметить повторяющиеся данные и отбрось их :-)))
select distinct , больше никак


AlexanderSK   (2003-06-04 12:20:00) [20]

например по f1

f1 f2 f3
1 2 3 (или 1 3 4 - без разницы)
2 4 5 (или 2 5 6 - без разницы)
3 6 7


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо