Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 ... 4 5 6 [7]   Вниз
  Печать  
Автор Тема: Выборка из одной таблицы в SQL  (Прочитано 177143 раз)
0 Пользователей и 1 Гость смотрят эту тему.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #180 : 10-12-2010 11:04 » 

Dana, неправильно.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Dana
Опытный

ru
Offline Offline
Пол: Женский

« Ответ #181 : 22-12-2010 10:32 » 

У меня горе. Нам сервер оракла снесли и все мои лабораторки умерли (( все желание отбили..блин...как так можно..хоть бы предупредили.
В общем я пока в шоке Не надо
Записан

Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #182 : 22-12-2010 11:02 » 

Dana, а ты чего не сохраняла исходники? Всмысле те sql запросы, которые ты делала, ты не сохранила у себя локальную копию?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #183 : 22-12-2010 11:05 » 

было бы чего переживать.
На каждый винт есть гайка.

http://www.sql-ex.ru/
Это чтоб ты не потеряла навыки (правда придется забыть об нотации оракла)
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dana
Опытный

ru
Offline Offline
Пол: Женский

« Ответ #184 : 23-12-2010 04:36 » 

Понадеялась на учебный сервер. Думала там же учителя - умные люди, ничего не случится. Ну и на тебе. Сейчас Оракл подняли но нет ни одного запроса.

Добавлено через 6 дней, 5 часов, 44 минуты и 47 секунд:
1.
Найти клиента, зарегистрировавшегося последним
Код: (SQL)
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
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #185 : 29-12-2010 10:17 » 

Dana, ты использовала max на одном из полей. Тебе нужно остальные поля сгруппировать.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #186 : 29-12-2010 10:20 » 

У тебя max выдает одно единственное значение, а все остальные поля будут давать множество значений. Групировать также нельзя.  Значит нужно делать два подзапроса. Первый будет искать максимальное значение и на основе этого запроса уже искать данные по клиенту.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #187 : 29-12-2010 10:21 » 

Групировать также нельзя.

всмысле?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #188 : 29-12-2010 10:23 » 

Все остальные поля зависят напрямую, что вычислит функция max. Что то мне не приходит на ум, по чему можно сгрупировать.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #189 : 29-12-2010 10:31 » 

Finch, мы видимо немного не о том?


Код: (SQL)
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

Код:
3	a
2 b
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #190 : 29-12-2010 10:34 » 

McZim, покажи эту конструкцию на примере вышеприведенного Даной.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #192 : 29-12-2010 11:07 » 

Finch, пока писал, понял что не вник в задание, ты прав.


Код: (SQL)
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
Опытный

ru
Offline Offline
Пол: Женский

« Ответ #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
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #194 : 29-12-2010 11:15 » 

Наверно можно сделать чуть проше. Правда я не знаю, как Oracle смотрит на LIMIT
Код: (SQL)
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
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #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
Опытный

ru
Offline Offline
Пол: Женский

« Ответ #196 : 29-12-2010 11:22 » 

Наверно можно сделать чуть проше. Правда я не знаю, как Oracle смотрит на LIMIT
Код: (SQL)
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
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #197 : 29-12-2010 11:23 » 

Dana, В твоем коде нужно применять псевдонимы. Иначе ты не сможеш воспользоваться результатоом подзапроса.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #198 : 29-12-2010 11:23 » 

мне найдо найти последнего зарегистрировавшегося, а в этом запросе я его не вижу

а ты по внимательней посмотри, он там затаился Улыбаюсь
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #199 : 29-12-2010 11:26 » 

Dana, Я сортирую computation.n_client по нисходяшей. Тогда получается что самый наибольшее значение, т.е. максимальное выскочит наверх. А потом только остается его показать в качестве результата. Что и делает LINIT ( ROWNUM <= 1). Если n_client является проиндексированным полем, тогда должно вроде как работать быстро.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Dana
Опытный

ru
Offline Offline
Пол: Женский

« Ответ #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
Опытный

ru
Offline Offline
Пол: Женский

« Ответ #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
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #202 : 29-12-2010 11:32 » 

А понял Улыбаюсь Не обратил внимание.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Dana
Опытный

ru
Offline Offline
Пол: Женский

« Ответ #203 : 29-12-2010 11:35 » 

2/
2.   Посчитать сумму долга клиента Александра Иванова за январь, февраль, март и апрель 2008 года

Думаю... Улыбаюсь

Надо вывести ссумму долга, но сначала найти Александра Иванова
« Последнее редактирование: 29-12-2010 11:46 от Dana » Записан

Прославься в городе - возбудишь озлобленье, а домоседом стань - возбудишь подозренье. Не лучше ли тебе, хотя б ты Хызром был, ни с кем не знаться, жить всегда в уединенье?
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #204 : 29-12-2010 11:52 » 

Это можно сделать в одном запросе. Я точно не знаю, как у тебя построена таблица. Но надеюсь, что таблица с записью долга у тебя выглядит примерно так. ID, Id_Client, Дата, Сумма.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Dana
Опытный

ru
Offline Offline
Пол: Женский

« Ответ #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
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #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
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #207 : 29-12-2010 12:18 » 

Dana, А зачем два запроса? Это можно свести в один запрос. И кстати, он у тебя правильно ругается. Ты  одно поле пытаешся сравнить с целой записью. И кстати почему n_debt?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Dana
Опытный

ru
Offline Offline
Пол: Женский

« Ответ #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
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #209 : 18-01-2011 20:07 » 

Dana, Извини, лениво искать по всей теме, как у тебя выглядят таблици. Можеш бросить их состав? Чтоб можно было помочь.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Страниц: 1 ... 4 5 6 [7]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines