Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Oracle SQL запрос - вопрос только к профессионалам!!!

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Базы данных
Предыдущая тема :: Следующая тема  
Автор Сообщение
swordfish



Зарегистрирован: 07.05.2002
Сообщения: 100
Откуда: Наб. Челны

СообщениеДобавлено: Сб Май 25 2002 04:05    Заголовок сообщения: Oracle SQL запрос - вопрос только к профессионалам!!! Ответить с цитатой

Привет Всем!

Я запускаю запрос:

SELECT SUBSTR( pps.name,5,20) functie_naam
, ppf.first_name||' '||decode(ppf.suffix,null,'',ppf.suffix||' ')||ppf.last_name inkoper_naam
, pcr.amount_limit goedkeurings_limiet
, pah.sequence_num actie_volgnr
FROM po_action_history pah
, po_position_controls ppc
, po_control_groups ppg
, per_positions pps
, po_control_functions pcf
, per_assignments_f paf
, per_people_f ppf
, po_control_rules pcr
WHERE pps.position_id = ppc.position_id
and pps.position_id = paf.position_id
AND ppc.control_group_id = ppg.control_group_id
AND pcf.enabled_flag = 'Y'
AND ppg.enabled_flag = 'Y'
AND ppc.control_group_id = pcr.control_group_id
AND nvl(pcr.inactive_date,sysdate) >= sysdate
AND sysdate between ppc.start_date and nvl(ppc.end_date,sysdate)
AND sysdate between pps.date_effective and nvl(pps.date_end,sysdate)
AND pcf.control_function_id = ppc.control_function_id
and pah.employee_id = paf.person_id
and pah.employee_id = ppf.person_id
AND SYSDATE BETWEEN ppf.effective_start_date AND ppf.effective_end_date
AND SYSDATE BETWEEN paf.effective_start_date AND paf.effective_end_date
AND paf.primary_flag = 'Y'
and pah.object_id = :poh_po_header_id
and pcf.document_type_code = 'PO'
and pcf.document_subtype = :poh_po_type
and pcr.object_code = 'DOCUMENT_TOTAL'
and pah.object_type_code = 'PO'
and pah.object_sub_type_code = :poh_po_type
AND pah.action_code = 'APPROVE'

Результат

functie_naam inkoper_naam actie_volgnr
-------------- ------------ ------------
Senior Inkoper Mister X 9
Senior Inkoper Mister Y 13

Но я только хочу одну строку с наибольшим значением по полю actie_volgnr(sequence_num). Кто-нибудь может подсказать как это сделать? Обратите внимание на то, что я не могу использовать групповые функции, так как каждая строка практически уникальна, а мне надо только одну!


Спасибо за труд,
Алексей.

P.S. Вопрос не из простых и его будет интересно решить просто для себя, что несомненно может когда-нибудь пригодиться.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
swordfish



Зарегистрирован: 07.05.2002
Сообщения: 100
Откуда: Наб. Челны

СообщениеДобавлено: Сб Май 25 2002 04:47    Заголовок сообщения: Re: Oracle SQL запрос - вопрос только к профессионалам!!! Ответить с цитатой

Ответ не нужен, уже знаю как это сделать.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Слава



Зарегистрирован: 02.10.2003
Сообщения: 45

СообщениеДобавлено: Пн Май 27 2002 09:02    Заголовок сообщения: Знаешь! - Расскажи! Ответить с цитатой

Ну так поведай нам, как ты это сделал. Надо делится умными решениями Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
swordfish



Зарегистрирован: 07.05.2002
Сообщения: 100
Откуда: Наб. Челны

СообщениеДобавлено: Пн Май 27 2002 09:31    Заголовок сообщения: Re: Знаешь! - Расскажи! Ответить с цитатой

Смысл примерно такой:
1. Сначала создаешь нужный запрос и указываешь порядок сорторовки по нужному полю в порядке убывания
2. Делаешь запрос к вышеуказанному выбирая первую строчку.

Вот в принципе все. Примерчик (полу-абстрактный)

SELECT table_name[, любое поле из подзапроса [, ...]] FROM
(SELECT table_name[, любое поле из таблиц указанных в выр. FROM [, ...]] FROM all_tables
ORDER BY table_name DESC)
WHERE rownum
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
swordfish



Зарегистрирован: 07.05.2002
Сообщения: 100
Откуда: Наб. Челны

СообщениеДобавлено: Пн Май 27 2002 09:33    Заголовок сообщения: Re: Знаешь! - Расскажи! Ответить с цитатой

SELECT table_name FROM (SELECT table_name FROM all_tables ORDER BY table_name DESC)
WHERE rownum
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
swordfish



Зарегистрирован: 07.05.2002
Сообщения: 100
Откуда: Наб. Челны

СообщениеДобавлено: Пн Май 27 2002 09:35    Заголовок сообщения: Re: Знаешь! - Расскажи! Ответить с цитатой

SELECT table_name FROM (SELECT table_name FROM all_tables ORDER BY table_name DESC)
WHERE rownum
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Слава



Зарегистрирован: 02.10.2003
Сообщения: 45

СообщениеДобавлено: Пн Май 27 2002 09:39    Заголовок сообщения: Re: Знаешь! - Расскажи! Ответить с цитатой

Ну Вы и загнули вопросик (тот который самый первый). Надо же было и поставить его так абстрактно как и ответили. Меня лично запутал сам запрос, пока его разобрал забыл в чем вся соль Smile
А это решение действительно простое и элегантное (впрочем и единственное).
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
swordfish



Зарегистрирован: 07.05.2002
Сообщения: 100
Откуда: Наб. Челны

СообщениеДобавлено: Пн Май 27 2002 09:41    Заголовок сообщения: Re: Знаешь! - Расскажи! Ответить с цитатой

Пытался указать что "роунам" меньше или равен одному, но почемуту сообщение режеться и не показывает ни строчки больше после "роунам"а
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Слава



Зарегистрирован: 02.10.2003
Сообщения: 45

СообщениеДобавлено: Пн Май 27 2002 09:46    Заголовок сообщения: Кстати а почему не так --> Ответить с цитатой

SELECT TOP 1 * FROM table ORDER BY table_column DESC;
Выбирается первая верхняя запись (ТОР 1) из упорядоченной таблицы (по возрастанию или убыванию все равно), как тебе такое решение?
По моему если тебе именно это нужно то это выражение еще проще.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
swordfish



Зарегистрирован: 07.05.2002
Сообщения: 100
Откуда: Наб. Челны

СообщениеДобавлено: Вт Май 28 2002 02:28    Заголовок сообщения: Re: Кстати а почему не так --> Ответить с цитатой

Я в первые вижу такую конструкцию, даже интересно стало. Так как в Оракл я точно такого не припомню, хотя документации прочитал не мало. Попробывал запустить и естественно ожидаемый результат - ошибка.

SELECT TOP 1 ALL_TABLES FROM table ORDER BY table_name DESC
*
ERROR at line 1:
ORA-00923: FROM keyword not found where expected

Может где еще это и допустимо, но на не моем сильно любимом Оракле. А про то, что первый загнул, так не было времени печатать. Пришлось тупо скопировать текст и послать.

Все равно, спасибо за совет, век живи век учись. Знать, что, что-то не работает тоже хорошо.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Слава



Зарегистрирован: 02.10.2003
Сообщения: 45

СообщениеДобавлено: Вт Май 28 2002 09:29    Заголовок сообщения: Re: Кстати а почему не так --> Ответить с цитатой

Вообще-то это стандартный SQL92, он даже в Аccess'е хавается, в Oracle тоже должна хаваться конструкция TOP N. Я сейчас задам этот вопрос в форуме.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
zomp



Зарегистрирован: 22.10.2001
Сообщения: 23
Откуда: Volgodonsk

СообщениеДобавлено: Вт Май 28 2002 14:33    Заголовок сообщения: Re: Знаешь! - Расскажи! Ответить с цитатой

Потому, что знаки "больше" или "меньше" воспринимается как часть HTML-тэга. Наверное, в тексте вместо них нужно писать < или &rt;
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Valera
Гость





СообщениеДобавлено: Ср Май 29 2002 05:25    Заголовок сообщения: Re: Oracle SQL запрос - вопрос только к профессионалам!!! Ответить с цитатой

select * from table1 where a in (select max(b)from table2) и т.д.
Вернуться к началу
swordfish



Зарегистрирован: 07.05.2002
Сообщения: 100
Откуда: Наб. Челны

СообщениеДобавлено: Чт Июн 06 2002 20:06    Заголовок сообщения: Не все так просто как кажеться. Ответить с цитатой

На твой вполне логический ответ скажу следующее. У меня у самого первая мысль была сделать так, но как уже сказал сразу, не могу использовать групповых функций. А функция MAX к таковым как раз и относиться.

Попробуй самый простой пример типа:
CREATE sequence tmp_seq;

CREATE OR REPLACE FUNCTION nv RETURN NUMBER IS
newnum NUMBER;
BEGIN
SELECT tmp_seq.nextval INTO newnum FROM dual;
RETURN newnum;
END;

SELECT empno, MAX(nv) FROM emp; -- Здесь будет ошибка!!!

Вот так-то оно бывает. Не позваляют нам легкой жизни.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Базы данных Часовой пояс: GMT + 3
Страница 1 из 1

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


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...