Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 Заголовок сообщения: Знаешь! - Расскажи! |
|
|
Ну так поведай нам, как ты это сделал. Надо делится умными решениями |
|
Вернуться к началу |
|
|
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: Знаешь! - Расскажи! |
|
|
Ну Вы и загнули вопросик (тот который самый первый). Надо же было и поставить его так абстрактно как и ответили. Меня лично запутал сам запрос, пока его разобрал забыл в чем вся соль А это решение действительно простое и элегантное (впрочем и единственное). |
|
Вернуться к началу |
|
|
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; -- Здесь будет ошибка!!!
Вот так-то оно бывает. Не позваляют нам легкой жизни. |
|
Вернуться к началу |
|
|
|