Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.011 c
1-38876
Asd
2004-02-04 21:18
2004.02.13
Не главное окно поверх всех других приложений


14-39100
copyr25
2004-01-19 21:52
2004.02.13
---|Ветка была без названия|---


1-38769
DDA
2004-02-03 00:26
2004.02.13
Hint in ListBox


14-39003
Nikky
2004-01-21 12:26
2004.02.13
Встроенный сервер СУБД


1-38791
BlackLord2003
2004-02-03 09:40
2004.02.13
Транслит





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский