Форум: "Базы";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];
ВнизПомогите с запросом Найти похожие ветки
← →
_mandrake_ (2004-01-16 17:58) [0]Извините если не в тему, но может кто поможет подправит запрос
Есть таблица. В ней 3 поля :
← →
_mandrake_ (2004-01-16 18:04) [1]Удалено модератором
← →
_mandrake_ (2004-01-16 19:31) [2]ну что никто не поможет ?
← →
Семен Сорокин (2004-01-16 19:42) [3]SELECT поле1, поле2, поле3
FROM таблица
WHERE поле3 IN (
SELECT MAX(поле3) FROM таблица GROUP BY поле1
)
ORDER BY поле1
← →
Johnmen (2004-01-17 01:08) [4]>Семен Сорокин © (16.01.04 19:42)
Не, не так !
>_mandrake_
SELECT T1.F1, T1.F2, T1.F_TIME
FROM Table T1
WHERE T1.F_TIME=(SELECT MAX(T2.F_TIME)
FROM Table T2
WHERE T1.F1=T2.F1)
← →
_mandrake_ (2004-01-20 16:57) [5]
> Johnmen © (17.01.04 01:08) [4]
> >Семен Сорокин © (16.01.04 19:42)
>
> Не, не так !
как раз так ! (правда при работе с БАЛЬШИМИ базами падает сервер :-((((
> SELECT T1.F1, T1.F2, T1.F_TIME
> FROM Table T1
> WHERE T1.F_TIME=(SELECT MAX(T2.F_TIME)
> FROM Table T2
> WHERE T1.F1=T2.F1)
этот запрос выдает только 1 запись - с максимальным временем, а мне надо для каждого уникального значения поля1 - свое максимальное значение поля3
← →
Johnmen (2004-01-20 17:04) [6]>_mandrake_ (20.01.04 16:57)
>этот запрос выдает только 1 запись
А ты проверил ?
← →
_mandrake_ (2004-01-20 17:12) [7]Еще вопрос - есть ли в sql функция чтоб вынуть с базы последние N записей? ( и чтоб в interbase работала, или я многого хочу? ;-)
← →
_mandrake_ (2004-01-20 17:18) [8]
> Johnmen © (20.01.04 17:04) [6]
> >_mandrake_ (20.01.04 16:57)
> >этот запрос выдает только 1 запись
>
> А ты проверил ?
Да проверил.
(На forum.codenet.ru мне дали такой же ответ, я долго старался доказать что это не работает, а потом выяснилось что запрос заточен под Access, MS Sql 2000, Oracle 8.x Кстати а у тебя что за субд?)
← →
Johnmen (2004-01-20 17:20) [9]>_mandrake_
А где опровержение [4] ???? Или ты просто голословен ?
>_mandrake_ (20.01.04 17:12)
Нет.
← →
Johnmen (2004-01-20 17:21) [10]>_mandrake_ (20.01.04 17:18)
Плохо проверял.
"Запрос идеально работает." (c) IB и клоны
:)
← →
_mandrake_ (2004-01-20 17:43) [11]Специально создал базу -
SET SQL DIALECT 3;
SET NAMES NONE;
CREATE DATABASE "C:\Bases\TEST.GDB"
USER "SYSDBA" PASSWORD "masterkey"
PAGE_SIZE 1024
DEFAULT CHARACTER SET NONE;
CREATE TABLE "testova" (
PROFFESION CHAR(10),
INTIME TIMESTAMP,
SURNAME CHAR(10));
заполнил поля
surname profession intime
Иванов сварщик 19.01.04 08:00
Петров слесарь 19.01.04 08:05
Сидоров грузчик 19.01.04 08:02
Иванов сварщик 20.01.04 08:10
Петров слесарь 20.01.04 08:01
Сидоров грузчик 20.01.04 08:06
и в результате твоего запроса получил -
Иванов сварщик 20.01.04 08:10
в результате запроса Семена Сорокина -
Иванов сварщик 20.01.04 08:10
Петров слесарь 20.01.04 08:01
Сидоров грузчик 20.01.04 08:06
Как можна лучше проверить?
← →
Johnmen (2004-01-20 18:05) [12]>_mandrake_ (20.01.04 17:43)
>...и в результате твоего запроса получил - ...
Наглая ложь !!!
:)
← →
_mandrake_ (2004-01-20 18:11) [13]
> >_mandrake_ (20.01.04 17:43)
> >...и в результате твоего запроса получил - ...
>
> Наглая ложь !!!
> :)
блин, зачем мне врать? Не знаю я почему так, но это ТАК!!!
← →
Johnmen (2004-01-20 18:15) [14]Приведи ПОЛНОСТЬ запрос, который выполнял с тестовой таблицей. И не говори, что он мой :)
← →
_mandrake_ (2004-01-20 18:22) [15]SELECT *
FROM "testova"
WHERE intime=(SELECT MAX(T2.intime)
FROM "testova" T2
WHERE surname=T2.surname)
← →
Johnmen (2004-01-20 18:25) [16]А теперь найди одно отличие ! Сущностное. От запроса, который я приводил.
← →
_mandrake_ (2004-01-20 18:29) [17]Извини, никогда бы не подумал что это может иметь значение. (но почему псевдонимы могут влиять на запрос?)
← →
Johnmen (2004-01-20 18:33) [18]>_mandrake_ (20.01.04 18:29)
Дело в том, что во вложенном запросе для surname ты не указал псевдоним. А значит считается, что это поле относится к запросу, для которого упомянуто, FROM "testova" T2.
Т.е. T2.surname=T2.surname.
Кстати, посмотри ещё на скорость выполнения...
← →
_mandrake_ (2004-01-20 18:35) [19]Ха, рано я обрадовалси... Это работает только с тестовой базой, с моей реальной базой где приблизительно 500тыс записей - висяк, как и в случае запроса Семена Сорокина. Но почему? Результат запроса (для моей БАЛЬШОЙ базы) типа -
select max(intime) from testova group by surname
выводится за секунд 20???
← →
Семен Сорокин (2004-01-20 18:55) [20]_mandrake_ (20.01.04 18:35) [19]
надеюсь про индексы мы помним?
← →
_mandrake_ (2004-01-20 19:06) [21]Да сделал индекс по полю со временем. Может еще че-нить заиндексить?
← →
Семен Сорокин (2004-01-20 19:13) [22]_mandrake_ (20.01.04 19:06) [21]
Да сделал индекс по полю со временем. Может еще че-нить заиндексить?
смотри сам, слишком много индексов - тоже нехорошо.
для твоего случая можно еще и для поля1(integer).
Ага и сообщи потом сколько запрос выполняется. :)
← →
_mandrake_ (2004-01-20 19:30) [23]Индекс по полю почти ничего не дал - все те же 20 сек. (Эапрос -
select max(поле_со_временем)from таблица group by поле1 ; )
Как я понимаю в записаном выше запросе делается почти вся работа, почему же виснет -
select * from таблица
where поле_со_временем IN (select max(поле_со_временем)from таблица group by поле1)
Ведь всегото и делов чтоб выбрать все поля с найденых уже записей.
← →
Johnmen (2004-01-20 21:33) [24]>_mandrake_
Для ускорения приведенного мною запроса сделай индекс на поле_со_временем и поле, по которому "соединяем".
По поводу запроса Семен Сорокин © (16.01.04 19:42) [3]:
Запрос "тяжелый" из-за группировки и из-за IN.
К тому же будет работать некорректно, если вдруг максимум значения датавремя для к.-л. человека совпадет с немаксимумом для другого...
← →
Krey (2004-01-20 22:02) [25]Ваши запросы выполнялись долго (на большой таблице) потому, что вы поставили в условие where в подзапрос.
т.е здесь скорость выполнения зависит от оптимизатора запросов вашей СУБД.
Предлагаю след. запрос:
Select a.field1,a.field2,a.field3
from table1 a,(Select max(field3) as max from table1 group by field1) b
where a.field3 = b.max
В этом запросе СУБД сделает два отдельных запроса и объединит их Inner join"ом
В вашем же случае СУБД без оптимизатора делала бы по одному подзапросу MAX()
для каждой записи из table1
Извините если где ошибка (писал на коленях и проверить некогда) но думаю смасл понятен.
Ответить скорее всего не смогу.
← →
Krey (2004-01-20 22:12) [26]Ой извините. У вас там InterBase.
Не знаю понимает она подзапросы в условии From.
В MSSQL, MSJET и FoxPro 9 выполнился бы.
← →
_mandrake_ (2004-01-21 09:31) [27]
> Johnmen © (20.01.04 21:33) [24]
> >_mandrake_
>
> Для ускорения приведенного мною запроса сделай индекс на
> поле_со_временем и поле, по которому "соединяем".
> По поводу запроса Семен Сорокин © (16.01.04 19:42) [3]:
> Запрос "тяжелый" из-за группировки и из-за IN.
> К тому же будет работать некорректно, если вдруг максимум
> значения датавремя для к.-л. человека совпадет с немаксимумом
> для другого...
Индексы сделаны, но реэультата это не дало, так как виснут оба запроса - и Семена Сорокина и твой. (под зависанием я понимаю безрезультатное :-) ожидание результата больше 20 мин. )
P.S. Чета мне все меньше нравится InterBase...
← →
Johnmen (2004-01-21 09:36) [28]>_mandrake_ (21.01.04 09:31) [27]
Причем тут IB ??? Попробуй на другом SQL сервере. Результат будет тот же.
Если нужно выжать максимальную скорость - пиши ХП.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.012 c