:: Visual Foxpro, Foxpro for DOS
Выборка как по индексу
sphinx
Автор

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Сразу скажу, что проблема такая есть и сейчас, как-то хорошо/правильно я ее думаю, что не решил.
Натолкнула фраза тов.Симпле из соседней ветки:

Цитата:
Простенькая прога лазит по двум свободным не связанным между собой таблицам

Дело даже не в связанности таблиц, еще раз...

Есть индекс по нескольким полям, 3-4 поля ключевые (ой, не я структуру разрабатывал, ее при всем желании сейчас изменить - это НЕРЕАЛЬНО по орг.причинам, от моего желания тут не зависит от слова совсем). Селектом как забрать первую попавшуюся запись? Я как рассуждал - если первая попавшаяся - значит в селекте можно сделать агрегацию по ОДНОМУ полю (ну, по нескольким - это маразм, выборка будет из нескольких записей каки-то агрегированных значений, например МИН(). По ОДНОМУ полю понятно - или индекс настроен на уникальное значение, которое является минимальным - тогда его и берем (по MIN() ). Если это не так, и в уникальный индекс летит случайное поле - тогда нам и агрегация по этому полю вполне сгодится. А по нескольким - опа, выберутся РАЗНЫЕ значения из разных записей.

Буду рад услышать коллег.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Выборка как по индексу
leonid

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
CREATE CURSOR tmp (key1 i, key2 d, key3 c(10), f1 i, f2 c(10))
INSERT INTO tmp VALUES (1, DATE(), "A", 5, "hasfddhgda")
INSERT INTO tmp VALUES (2, DATE()-1, "B", 6, "dhgda")
INSERT INTO tmp VALUES (3, DATE()+1, "C", 8, "asfhgda")
INSERT INTO tmp VALUES (1, DATE(), "A", 15, "aaaaaaa")
INSERT INTO tmp VALUES (2, DATE()-1, "B", 16, "adddddd")
INSERT INTO tmp VALUES (3, DATE()+1, "C", 18, "dfdf")
INSERT INTO tmp VALUES (1, DATE(), "A", 25, "e")
INSERT INTO tmp VALUES (2, DATE()-1, "B", 26, "t")
INSERT INTO tmp VALUES (3, DATE()+1, "C", 28, "u")
SELECT t.key1, t.key2, t.key3, t.f1, t.f2 FROM (SELECT RECNO() rn, * FROM tmp) t join ;
(SELECT key1, key2, key3, MIN(rn) rn FROM (SELECT RECNO() rn, * FROM tmp) y GROUP BY key1, key2, key3) z ;
ON t.rn = z.rn ;
WHERE t.key1 = 2 AND t.key2 = DATE()-1 AND t.key3 = "B"
Ratings: 0 negative/0 positive
Re: Выборка как по индексу
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
1) Думаешь сильно понятно описание проблемы Хоть бы пример тестовый набросал - исходный курсор и что надо найти... Что за "первая попавшаяся" - т.е. поиск не по всем компонентам первичного ключа (если по всем, то запись находится "уникально" - т.к. она одна на каждую комбинацию)? Или вообще не по полям в него входящим?
2) То что настолько заточено на FPD стиль лучше не трогать (как минимум без полноценного рефакторинга, в т.ч. изменения структуры БД) - пусть в FPD стиле и остаётся. Был там какой LOCATE/SEEK и прямой доступ к "найденной" записи - так пусть и остаётся. Кстати, простой LOCATE будет гораздо эффективнее запроса a-la leonid (его запрос как раз по "неуникальной" комбинации полей и работает - но я так понял что у тебя есть таки PK, т.е. уникальная комбинация - ну грубо говоря добавление в PK поля f1 к этому приведёт для указанных данных). Это не говоря уж о его практической "нечитаемости"


------------------
WBR, Igor
Ratings: 0 negative/3 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 19 alex;  (Гостей: 18)

© 2000-2024 Fox Club 
Яндекс.Метрика