Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Косяк с DISTINCT, меняет местами строки 
:(
    Опции темы
ТоляМБА
Дата 18.5.2005, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: 3
Всего: 252



Delphi 6, ADO, dBase IV

Здравствуйте! У меня возникла следующая проблема
Есть следующая табла (для примера)

ONE; TWO; TRE
a; 5,00000; 1
b; 10,00000; w
b; 10,00000; e
a; 5,00000; 1

Выполняем запрос SQL:
Код

select one,two,tre
from table1


Видим результат:
ONE; TWO; TRE
a; 5,00000; 1
b; 10,00000; w
b; 10,00000; e
a; 5,00000; 1

Выполняем другой запос SQL:
Код

select distinct one,two,tre
from table1


В результате получаем:
ONE; TWO; TRE
a; 5,00000; 1
b; 10,00000; e
b; 10,00000; w

Вот скажите мне – какого … SQL поменял местами положение строк ONE=’b’? Я его просил?
Как этого избежать? То есть чтоб одинаковые строки не выводились, а неодинаковые оставались в той же последовательности, что и были. Вопрос горящий.



PM   Вверх
DimW
Дата 18.5.2005, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



сортировкой строк в SQL управляет оперетор ORDER BY.
а то что запрос тебе 100 раз вывел в одном поряке строки, это незначит, что в 101 раз они выведутся именно так же.

PM MAIL ICQ   Вверх
SPrograMMer
Дата 18.5.2005, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Спамер :)
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 5.11.2004
Где: Краснодар

Репутация: 1
Всего: 6



Цитата(DimW @ 18.5.2005, 15:31)
то что запрос тебе 100 раз вывел в одном поряке строки, это незначит, что в 101 раз они выведутся именно

УГУ!

и есчо на эту же тему: вообще-то понятия нумерации строчек в БД нету, нельзя сказать что вот эта запись - первая, а вот это тринадцатая, в связи с этим ОБЫЧНО в каждой реляцонной таблице, создаётся первичный ключ, который и будет показывать "номер" записи. Я имею ввиду что записи в таблицах неупорядочены ни по какому критерию. Запрос на изменение набора данных - Insert строго говоря может "всунуть" новую запись, как в "конец" так и в "начало", так и куда нить в середку.




--------------------
животное = зверь
законченный гентушник
PM MAIL ICQ Jabber   Вверх
<Spawn>
Дата 21.5.2005, 06:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 2
Всего: 64



Цитата
Как этого избежать? То есть чтоб одинаковые строки не выводились, а неодинаковые оставались в той же последовательности, что и были. Вопрос горящий.


Ввести первичный ключ(допустим, назовем его pkey), который будет увеличиваться при каждой вставляемой новой записи и допсать запрос так:

Код

select distinct one,two,tre
from table1
order by pkey asc


либо, если тебе известен критерий последовательности получаемых данных, то можно использовать нужные поля для сортировки, допустим так:

Код

select distinct one,two,tre
from table1
order by tre desc


Кстати, прими к сведению, что distinct крайне тяжелая операция и употреблять ее следует с большой осторожностью, т.к. она сначала тянет записи клиенту, а потом только устраняет дубликаты(хотя может в других СУБД и не так - я сужу по Oracle smile )

Это сообщение отредактировал(а) <Spawn> - 21.5.2005, 06:13


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
ТоляМБА
Дата 23.5.2005, 05:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: 3
Всего: 252



2 <Spawn> Хотя я так уже и сделал сам, всё равно - БОЛЬШОЕ СПАСИБО. Теперь я хоть уверен, что на правильном пути.
А насчёт
Цитата
Кстати, прими к сведению, что distinct крайне тяжелая операция и употреблять ее следует с большой осторожностью, т.к. она сначала тянет записи клиенту, а потом только устраняет дубликаты

Так у меня база локальная, небольшая в формате dBase.
PM   Вверх
Vit
Дата 23.5.2005, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Distinct по трём полям это кхе-кхе... не хорошо... напрашивается нормализация таблиц...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
ТоляМБА
Дата 23.5.2005, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: 3
Всего: 252



2 VIT
Sorry. Оговорился. У меня не
Цитата
база
как таковая, а просто таблица, а получается она путем выгрузки (раз в 2 недели) из базы (на сервере PERVACIVE) поэтому такие косяки и лезут.
PM   Вверх
Medved
Дата 23.5.2005, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 1
Всего: 154



Цитата
а потом только устраняет дубликаты(хотя может в других СУБД и не так - я сужу по Oracle


Если я не ошибаюсь, в MSSQL такая же ботва.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Vit
Дата 23.5.2005, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Не могу сказать про dbase, на MS SQL Server - такие вопросы решаются установкой уникального индекса по всем трём полям с указанием опции игнорирования дубликатов. Насколько я знаю BDE+Paradox работают так же... Имеет смысл покопаться в опциях чтобы предотвратить попадание мусора, чем потом разгребать его


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0557 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.