McZim
|
|
« Ответ #180 : 10-12-2010 11:04 » |
|
Dana, неправильно.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Dana
|
|
« Ответ #181 : 22-12-2010 10:32 » |
|
У меня горе. Нам сервер оракла снесли и все мои лабораторки умерли (( все желание отбили..блин...как так можно..хоть бы предупредили. В общем я пока в шоке
|
|
|
Записан
|
Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
|
|
|
McZim
|
|
« Ответ #182 : 22-12-2010 11:02 » |
|
Dana, а ты чего не сохраняла исходники? Всмысле те sql запросы, которые ты делала, ты не сохранила у себя локальную копию?
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Sla
|
|
« Ответ #183 : 22-12-2010 11:05 » |
|
было бы чего переживать. На каждый винт есть гайка. http://www.sql-ex.ru/Это чтоб ты не потеряла навыки (правда придется забыть об нотации оракла)
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Dana
|
|
« Ответ #184 : 23-12-2010 04:36 » |
|
Понадеялась на учебный сервер. Думала там же учителя - умные люди, ничего не случится. Ну и на тебе. Сейчас Оракл подняли но нет ни одного запроса. Добавлено через 6 дней, 5 часов, 44 минуты и 47 секунд:1. Найти клиента, зарегистрировавшегося последним SELECT (MAX(computation.n_client)), C_FIRST_NAME, C_SECOND_NAME, C_LAST_NAME, client.n_city,computation.n_debt,computation.d_computation FROM client, computation, city WHERE client.n_client=computation.n_client AND client.n_city=city.n_city оракл выдает ORA-00937: not a single-group group function Что это значит?
|
|
« Последнее редактирование: 29-12-2010 10:21 от Dana »
|
Записан
|
Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
|
|
|
McZim
|
|
« Ответ #185 : 29-12-2010 10:17 » |
|
Dana, ты использовала max на одном из полей. Тебе нужно остальные поля сгруппировать.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #186 : 29-12-2010 10:20 » |
|
У тебя max выдает одно единственное значение, а все остальные поля будут давать множество значений. Групировать также нельзя. Значит нужно делать два подзапроса. Первый будет искать максимальное значение и на основе этого запроса уже искать данные по клиенту.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
McZim
|
|
« Ответ #187 : 29-12-2010 10:21 » |
|
Групировать также нельзя.
всмысле?
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #188 : 29-12-2010 10:23 » |
|
Все остальные поля зависят напрямую, что вычислит функция max. Что то мне не приходит на ум, по чему можно сгрупировать.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
McZim
|
|
« Ответ #189 : 29-12-2010 10:31 » |
|
Finch, мы видимо немного не о том? WITH t AS ( SELECT 1 AS num, 'a' AS nm FROM dual UNION ALL SELECT 2, 'a' FROM dual UNION ALL SELECT 3, 'a' FROM dual UNION ALL SELECT 2, 'b' FROM dual UNION ALL SELECT 0, 'b' FROM dual ) SELECT MAX(num), nm FROM t GROUP BY nm
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #190 : 29-12-2010 10:34 » |
|
McZim, покажи эту конструкцию на примере вышеприведенного Даной.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Sla
|
|
« Ответ #191 : 29-12-2010 10:41 » |
|
SELECT (MAX(computation.n_client)), C_FIRST_NAME, C_SECOND_NAME, C_LAST_NAME, client.n_city,computation.n_debt,computation.d_computation FROM client, computation, city WHERE client.n_client=computation.n_client AND client.n_city=city.n_city group by C_FIRST_NAME, C_SECOND_NAME, C_LAST_NAME, client.n_city,computation.n_debt,computation.d_computation
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
McZim
|
|
« Ответ #192 : 29-12-2010 11:07 » |
|
Finch, пока писал, понял что не вник в задание, ты прав. CREATE TABLE t_client(n_client NUMBER, C_FIRST_NAME varchar2(256), C_SECOND_NAME varchar2(256), C_LAST_NAME varchar2(256), n_city NUMBER) CREATE TABLE t_computation(n_client NUMBER,n_debt NUMBER,d_computation NUMBER) CREATE TABLE t_city(n_city NUMBER)
INSERT INTO t_client VALUES(1,'Maxim', 'Filatov', 'aaa', 100) INSERT INTO t_client VALUES(2,'Anna', 'Filatova', 'bbb', 100) INSERT INTO t_client VALUES(3,'Timofey', 'Filatov', 'ccc', 100)
INSERT INTO t_computation VALUES(1,20,30) INSERT INTO t_computation VALUES(2,30,30) INSERT INTO t_computation VALUES(3,40,30)
INSERT INTO t_city VALUES(100)
SELECT cl.C_FIRST_NAME, cl.C_SECOND_NAME, cl.C_LAST_NAME, cl.n_city,cm.n_debt, cm.d_computation FROM t_client cl, t_computation cm WHERE cl.n_client = cm.n_client AND cl.n_client IN (SELECT MAX(n_client) FROM t_client) AND cl.n_city IN (SELECT ct.n_city FROM t_city ct) Timofey Filatov ccc 100 40 30
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Dana
|
|
« Ответ #193 : 29-12-2010 11:14 » |
|
SELECT * FROM client WHERE n_client = (SELECT max(n_client) FROM computation)
AND computation.n_client=client.n_client) -стоит писать или нет
|
|
« Последнее редактирование: 29-12-2010 11:18 от Dana »
|
Записан
|
Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #194 : 29-12-2010 11:15 » |
|
Наверно можно сделать чуть проше. Правда я не знаю, как Oracle смотрит на LIMIT SELECT computation.n_client, C_FIRST_NAME, C_SECOND_NAME, C_LAST_NAME, client.n_city,computation.n_debt,computation.d_computation FROM client, computation, city WHERE client.n_client=computation.n_client AND client.n_city=city.n_city ORDER BY computation.n_client DESC LIMIT 1;
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
McZim
|
|
« Ответ #195 : 29-12-2010 11:22 » |
|
Finch, вместо LIMIT в Oracle используют ROWNUM <= 1.
Но, я специально вынес, внутреннее соединение с city в подзапрос, в интерпретации Oracle, нужно так делать, за исключением некоторых случаев, так как Cost Based Optimizator, может применять лучшие планы выполнения запроса в зависимости от размеров таблиц!
И все же лучше применить аналитический max чем сортировку!
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Dana
|
|
« Ответ #196 : 29-12-2010 11:22 » |
|
Наверно можно сделать чуть проше. Правда я не знаю, как Oracle смотрит на LIMIT SELECT computation.n_client, C_FIRST_NAME, C_SECOND_NAME, C_LAST_NAME, client.n_city,computation.n_debt,computation.d_computation FROM client, computation, city WHERE client.n_client=computation.n_client AND client.n_city=city.n_city ORDER BY computation.n_client DESC LIMIT 1; мне найдо найти последнего зарегистрировавшегося, а в этом запросе я его не вижу
|
|
|
Записан
|
Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #197 : 29-12-2010 11:23 » |
|
Dana, В твоем коде нужно применять псевдонимы. Иначе ты не сможеш воспользоваться результатоом подзапроса.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
McZim
|
|
« Ответ #198 : 29-12-2010 11:23 » |
|
мне найдо найти последнего зарегистрировавшегося, а в этом запросе я его не вижу
а ты по внимательней посмотри, он там затаился
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #199 : 29-12-2010 11:26 » |
|
Dana, Я сортирую computation.n_client по нисходяшей. Тогда получается что самый наибольшее значение, т.е. максимальное выскочит наверх. А потом только остается его показать в качестве результата. Что и делает LINIT ( ROWNUM <= 1). Если n_client является проиндексированным полем, тогда должно вроде как работать быстро.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Dana
|
|
« Ответ #200 : 29-12-2010 11:27 » |
|
SELECT computation.n_client, C_FIRST_NAME, C_SECOND_NAME, C_LAST_NAME, client.n_city,computation.n_debt,computation.d_computation FROM client, computation, city WHERE client.n_client=computation.n_client AND client.n_city=city.n_city ORDER BY computation.n_client DESC ROWNUM <= 1 Оракл говорит что
ORA-00933: SQL command not properly ended
Но это так.
McZim, а затаился он наверно тут ORDER BY computation.n_client DESC LIMIT 1;
|
|
|
Записан
|
Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
|
|
|
Dana
|
|
« Ответ #201 : 29-12-2010 11:31 » |
|
Dana, В твоем коде нужно применять псевдонимы. Иначе ты не сможеш воспользоваться результатоом подзапроса.
SELECT * FROM client cl WHERE n_client = (SELECT max(n_client) FROM computation com) AND com.n_client=cl.n_client
|
|
|
Записан
|
Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #202 : 29-12-2010 11:32 » |
|
А понял Не обратил внимание.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Dana
|
|
« Ответ #203 : 29-12-2010 11:35 » |
|
2/ 2. Посчитать сумму долга клиента Александра Иванова за январь, февраль, март и апрель 2008 года Думаю... Надо вывести ссумму долга, но сначала найти Александра Иванова
|
|
« Последнее редактирование: 29-12-2010 11:46 от Dana »
|
Записан
|
Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #204 : 29-12-2010 11:52 » |
|
Это можно сделать в одном запросе. Я точно не знаю, как у тебя построена таблица. Но надеюсь, что таблица с записью долга у тебя выглядит примерно так. ID, Id_Client, Дата, Сумма.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Dana
|
|
« Ответ #205 : 29-12-2010 12:08 » |
|
select sum(n_debt) From computation com where n_debt= (select * from client cl where upper (cl.c_first_name) like upper ('александр') and upper (cl.c_last_name) like upper ('иванов'))
ORA
ORA-00913: too many values
|
|
|
Записан
|
Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
|
|
|
McZim
|
|
« Ответ #206 : 29-12-2010 12:13 » |
|
Dana, Я сортирую computation.n_client по нисходяшей. Тогда получается что самый наибольшее значение, т.е. максимальное выскочит наверх. А потом только остается его показать в качестве результата. Что и делает LINIT ( ROWNUM <= 1). Если n_client является проиндексированным полем, тогда должно вроде как работать быстро.
Дело больше в методе доступа, а не в простом измерении времени отклика. В данном случае не стоит это обсуждать.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #207 : 29-12-2010 12:18 » |
|
Dana, А зачем два запроса? Это можно свести в один запрос. И кстати, он у тебя правильно ругается. Ты одно поле пытаешся сравнить с целой записью. И кстати почему n_debt?
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Dana
|
|
« Ответ #208 : 12-01-2011 06:47 » |
|
Dana, А зачем два запроса? Это можно свести в один запрос. И кстати, он у тебя правильно ругается. Ты одно поле пытаешся сравнить с целой записью. И кстати почему n_debt?
n_debt долг на начало периода, поэтому его и беру. В одном запросе примерно так будет: select n_debt from client cl, computation com where upper (cl.c_first_name) like upper ('александр') and upper (cl.c_last_name) like upper ('иванов'), но мне то нужна сумма долга за 4 месяца (ян февр мар апрель) вот и думаю как так сделать Добавлено через 1 час, 40 минут и 41 секунду: Select sum(pa.n_sum) from client cl,payment pa, computation com where upper (cl.c_first_name) like upper ('александр') and upper (cl.c_last_name) like upper ('иванов')and cl.n_client = pa.n_client and pa.n_client = com.n_client and to_char (com.d_computation, 'MONTH')='ФЕВРАЛЬ'and to_char (com.d_computation, 'MONTH')='МАРТ'and to_char (com.d_computation, 'MONTH')='АПРЕЛЬ' Выдает - Добавлено через 5 дней, 22 часа, 20 минут и 32 секунды:help...
|
|
« Последнее редактирование: 18-01-2011 06:55 от Dana »
|
Записан
|
Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #209 : 18-01-2011 20:07 » |
|
Dana, Извини, лениво искать по всей теме, как у тебя выглядят таблици. Можеш бросить их состав? Чтоб можно было помочь.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
|