Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Программирование

Задачи для обучения SQL-запросам в Супермаге : Программирование

21.11.2024 23:03


13.10.2014 17:40
вариант №2

select ss.typename Документ, count(ss.typename) Количество from smdoclog s, ssobjecttypes ss
where (s.docdate = trunc(SYSDATE) or s.docdate = trunc(SYSDATE)-1)
and ss.objtype = s.doctype
group by ss.typename
13.10.2014 17:51
Цитата:
BotMan короче уперся в дату, запрос проходит без ошибки, но ничего не выводит...
В BETWEEN параметры должны идти от меньшего к большему.
И по условию смотреть нужно не дату документа, а время его изменения - eventtime.

Цитата:
и еще, как лучше писать через INNER JOIN или просто через Запятую?
Читал про проблемы с JOIN на версиях оракла ниже 10. Далее не в курсе.
Мне через запятую удобнее.
13.10.2014 17:55
А при чем тут docdate? Вот, я написал бы вроде такого:
Код:
select ss.typename, count(ss.typename) 
from supermag.smdoclog s, supermag.ssobjecttypes ss
where s.eventtime>sysdate -1
and ss.objtype = s.doctype
group by ss.typename order by 2 desc;
давай тогда для понимания, выбери уникальные значения docdate из supermag.smdoclog и отсортируй их по возрастанию...
13.10.2014 18:25
Цитата:
OlegON А при чем тут docdate?
ну я подумал что eventtime это время изменения документа, а docdate дата создания.
13.10.2014 18:33
select docdate from smdoclog
order by 1 asc
13.10.2014 18:35
select distinct docdate from smdoclog

order by 1 asc
13.10.2014 19:10
правильно, только вот для кода соответствующий тег на форуме есть, читаемость повышает.
еще аналогичная задачка - сделать вывод по количеству, как с документами, только с выводом и расшифровкой сотрудников. Т.е. в выборку выше по докам добавить детализацию по сотрудникам (smstaff).
13.10.2014 21:02
Олег, я не силён в оракле, но полагаю, что через запятую джойнить таблицы несколько расточительно. Тут left join на мой взгляд смотрелся бы куда лучше. Или у оракла нет такового (сильно сомневаюсь) ?
13.10.2014 21:53
Цитата:
Micle Олег, я не силён в оракле, но полагаю, что через запятую джойнить таблицы несколько расточительно. Тут left join на мой взгляд смотрелся бы куда лучше. Или у оракла нет такового (сильно сомневаюсь) ?
Я тоже не силен в программировании Oracle, но в нем поддерживается LEFT JOIN (т.е. ANSI-нотация) и есть LEFT JOIN, который можно было бы записать так
Код:
select ss.typename, count(ss.typename) 
from supermag.smdoclog s, supermag.ssobjecttypes ss
where s.eventtime>sysdate -1
and ss.objtype = s.doctype(+)
group by ss.typename order by 2 desc;
т.е. в оракловой нотации. ANSI-варианты кое-как терпимо и без багов стали работать в 11 версии, хотя сам Том Кайт рекомендовал их использование еще в 10 версии. Я с самого начала пользовался оракловой нотацией, поэтому ANSI пользоваться не люблю, не умею. Но не поленился, переписал и сравнил планы
Код:
select ss.typename, count(ss.typename) 
from supermag.ssobjecttypes ss
left join supermag.smdoclog s on
(ss.objtype = s.doctype and s.eventtime>sysdate -1)
group by ss.typename order by 2 desc;
практически идентичны, т.е. расход ресурсов даже на весьма значительной по размерам БД абсолютно одинаковый.
14.10.2014 11:33
в общем вот, что получилось, не уверен что правильно, так как не знаю, что за что цеплять
Код:
select ff.serverlogin, p.typename,  count(p.typename) from smstaff ff, 
(select s.username, ss.typename from supermag.smdoclog s, supermag.ssobjecttypes ss
where s.eventtime>sysdate -1
and ss.objtype = s.doctype(+)
) p
where ff.serverlogin=p.username
group by p.typename, ff.serverlogin order by 1 desc
и хотел спросить, что означает этот (+) ??
Часовой пояс GMT +3, время: 23:03.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.