![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Повторяющиеся значения
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