Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Новости сайта "Упражнения по SQL" (http://www.sql-ex.ru) 133


Новости сайта "Упражнения по SQL (http://www.sql-ex.ru)" Выпуск 133 (31 марта 2007 г.)

SQL Exercises

Новым посетителям сайта

Сайт посвящен изучению языка, с помощью которого осуществляется взаимодействие с реляционными (и не только) СУБД. Суть обучения состоит в выполнении заданий на написание запросов к учебным базам данных; при этом система контролирует правильность выполнения заданий. В настоящее время реализованы все операторы подъязыка манипуляции данными (DML), которые включают в себя оператор извлечения данных SELECT, а также операторы модификации данных - INSERT, DELETE и UPDATE.

Мы надеемся, что справочного материала сайта окажется достаточно для самостоятельного обучения. Кроме того, свои решения вы можете обсудить на форуме сайта. Опытных же специалистов приглашаем проверить (продемонстрировать) свое мастерство и принять участие в соревновании, обеспечиваемом рейтинговой системой учета времени выполнения заданий. Фактически, рейтинг ведется на втором этапе тестирования, который начинается сейчас после решения 57-ти задач первого этапа. При подсчете рейтинга каждого участника отбрасывается один самый худший показатель среди всех решенных им упражнений.

Демонстрация плана выполнения запроса и сравнительная оценка эффективности решений поможет вам освоить принципы оптимизации запросов, которые пригодятся на третьем рейтинговом этапе.

Имеется возможность получить сертификат по SQL DML при выполнении определенного количества заданий.


Новости сайта

§ По предложению Lexus дополнил рейтинг задач второго этапа логином автора задачи и датой ее публикации.

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

§ Уже три человека решили все задачи, поделив призовые места в следующем порядке:
lepton
vlksm
Roman S. Golubin

§ Venser, появившийся в сотне на прошлой неделе, завершил решение задач второго этапа, показав весьма достойный результат (задач 138, время 4.258). Одна задача до третьего этапа (плюс замененная) осталась IAS56 (136, 104.546).

§ Продвинулись в рейтинге или восстановили статус-кво, решив замененные задачи:
SolYUtor (141, 17.629; третий зтап: 2.517, 11)
pаparome (140, 2.741; 0.049, 10)
Gavrila (138, 20.220; 0.513, 7)
Палкин (140, 27.657; 7.373, 7)
Johan (140, 12.786; 11.402, 7)
Snowbear (137, 4.106; 0.000, 3)
PavelPS (138, 4.773)
Arcan (137Ю 7.388)
Damirishe (136, 11.246)
Botch (136, 19.880)
avk (135, 57.906)
wasp (136, 77.816)
gps (133, 217.162)
olegv (127, 71.181)
Fomichev (125, 12.361)
15th (124, 12.470)
Sp999 (125, 37.836)
yuriy.rozhok (120, 15.741)

§ На этой неделе сертифицированы:
Venser (B07017320) [AR] (г.Москва, Россия)
olegv (B07013752) [AR] (г.Екатеринбург, Россия)
ЖеняИ (A07008781) [BK] (г.Новосибирск, Россия)

§ Число подписчиков - 3522

Число участников рейтинга - 9548

Число участников второго этапа - 915

Сертифицировано на сайте - 149

Лучшие результаты (ТОР 20)

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Мурашкин И.В. (lepton) 142 142 21 341 371 15.737 5.539 14 29 Mar 2007 30 Mar 2007
2 >Карасёва Н.В. (vlksm) 142 142 21 341 328 31.344 5.912 14 30 Mar 2007 30 Mar 2007
3 Голубин Р.С. (Roman S. Golubin) 142 142 21 341 588 55.391 34.203 14 29 Mar 2007 30 Mar 2007
4 Агапов В. (KERBEROS) 138 141 20 330 89 6.163 1.262 11 20 Nov 2006 29 Mar 2007
5 Солдатенков Ю.С. (SolYUtor) 141 141 21 338 315 17.629 2.517 11 29 Mar 2007 30 Mar 2007
6 Кувалкин К.С. (Cyrilus) 138 141 20 330 746 12.405 2.519 11 10 Dec 2006 30 Mar 2007
7 Зверев Д.Л. (dimzv) 138 141 20 330 1141 9.294 4.938 11 19 Dec 2006 22 Dec 2006
8 Войнов П.Е. (pаparome) 140 142 21 335 579 2.741 .049 10 26 Mar 2007 30 Mar 2007
9 Тарасов Д.Б. (Gavrila) 138 140 21 330 577 20.220 .513 7 26 Mar 2007 30 Mar 2007
10 Мальцев А.В. (Палкин) 140 141 21 334 224 27.657 7.373 7 29 Mar 2007 30 Mar 2007
11 Васьков Е.В. (Johan) 140 140 21 334 253 12.786 11.402 7 29 Mar 2007 30 Mar 2007
12 Валуев Д.И. (Fiolent) 136 140 20 323 1188 116.922 62.302 4 05 Dec 2006 26 Mar 2007
13 Юлдашев М.Р. (Snowbear) 137 139 20 324 614 4.106 .000 3 24 Mar 2007 28 Mar 2007
14 Держальцев В.А. (MadVet) 135 139 20 321 540 34.190 3.085 3 08 Oct 2006 19 Oct 2006
15 Палий С.А. (PS_Sergey) 136 139 20 322 212 15.704 4.188 3 01 Dec 2006 03 Dec 2006
16 Северюхин Ю.А. (Venser) 138 138 21 327 26 4.258 .000 0 29 Mar 2007 29 Mar 2007
17 Шептунов П.П. (PavelPS) 138 138 21 327 92 4.773 .000 0 29 Mar 2007 30 Mar 2007
18 >Креславский О.М. (Arcan) 137 137 21 323 59 7.388 .000 0 30 Mar 2007 30 Mar 2007
19 Салимов Д.М. (Damirishe) 136 138 21 323 186 11.246 .000 0 26 Mar 2007 30 Mar 2007
20 >Виноградов С.М. (Botch) 136 137 21 321 168 19.880 .000 0 30 Mar 2007 30 Mar 2007

Лучшие результаты за неделю

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 Лаптиев И.Л. (Xthysq) 58 58 110 34 144 486 29 Mar 2007
2 Битин А. (bav) 53 53 100 32 132 616 28 Mar 2007
3 Бабков А.В. (ICEBERG) 40 40 75 34 109 930 28 Mar 2007
4 >Оксенюк Б.П. (BiO) 55 55 105 0 105 1013 30 Mar 2007
5 Журавский О.В. (JetuS) 52 52 99 0 99 1178 30 Mar 2007
6 >31 (M_Anna) 38 39 67 14 81 1515 30 Mar 2007
7 Tychko (AescCasper) 32 60 70 9 79 803 30 Mar 2007
8 >Петренко Ю.В. (SharedNoob) 32 32 59 17 76 1723 30 Mar 2007
9 Breger A.V. (a5b) 41 41 74 1 75 1754 27 Mar 2007
10 Вильчинский В.Н. (LerN) 40 40 74 0 74 1560 29 Mar 2007
11 >Жилин Р.И. (-=R=-) 38 38 69 5 74 1796 30 Mar 2007
12 Галамага А. (Sanchos) 39 39 72 1 73 1835 27 Mar 2007
13 Стрелков С.В. (ССВ) 29 29 52 5 57 2518 28 Mar 2007
14 >Буран Е.А. (strongb) 31 31 56 0 56 2571 30 Mar 2007
15 D V. (vortex) 29 29 52 1 53 2777 30 Mar 2007
16 Яковлев И.Г. (Ledorub) 24 28 45 1 46 2959 28 Mar 2007
17 >Усов В.И. (Викт) 21 29 43 0 43 2858 30 Mar 2007
18 Северюхин Ю.А. (Venser) 18 138 40 2 42 16 29 Mar 2007
19 >Волковецкий В.П. (Victoren) 25 25 41 1 42 3451 30 Mar 2007
20 >Стольников (alexeyst) 12 67 22 19 41 472 30 Mar 2007
21 >Федоров Е.Л. (Eg) 19 53 39 0 39 1114 30 Mar 2007
22 - И. (tiger) 27 27 39 0 39 3702 30 Mar 2007
23 Молочников Е. (Reer) 15 29 37 0 37 2841 27 Mar 2007
24 >Медведев А.В. (Durist) 24 24 37 0 37 3826 30 Mar 2007
25 Балалаев П.П. (Пилигрим) 14 29 35 0 35 2872 30 Mar 2007
26 >зюзя (cher) 14 39 34 0 34 1654 30 Mar 2007
27 Точилин К. (alive_) 23 23 34 0 34 4181 29 Mar 2007
28 Star E. (Star_1978) 18 24 31 0 31 3939 30 Mar 2007
29 >Копыл Ф.Ф. (Fantom) 22 22 31 0 31 4618 30 Mar 2007
30 M O. (KaiserOto) 12 28 30 0 30 3052 27 Mar 2007

Изучаем SQL

Некоторые примеры использования XML (окончание, начало вып.132)

Yousef Ekhtiari (оригинал: Some Usages for XML)
Перевод Моисеенко С.И.

Извлечение значений из списка, разделенного запятыми (CSV)

Несколько раз на форумах я видел сообщения от новых разработчиков SQL, которые спрашивали, как они могут передать массив в процедуру. На мой взгляд, единственным ответом на тот вопрос является использование списка с запятой-разделителем; однако его обратное преобразование к набору строк - это головная боль. Некоторые разработчики будут использовать цикл для извлечения значений из списка. В этой статье я покажу Вам новый способ решения этой проблемы.

Решение циклом:

Итак, начнем. Пусть имеется следующая таблица:

create proc usp_LoopVersion @CSV varchar(max)
AS

SET NOCOUNT ON
declare @res table (val varchar(100))
declare @pos int
set @pos=CHARINDEX(',',@CSV,1)

while @pos > 0
begin
     insert @res
     values(ltrim(substring(@CSV,1,@pos-1)))
     set @CSV=right(@CSV,len(@CSV)-@pos)
     set @pos=CHARINDEX(',',@CSV,1)
end

insert @res
values(ltrim(@CSV))

select *
     from @res

Здесь просто определяется положение первой запятой, затем извлекается первое значение списка (от начала списка до позиции найденной запятой) и добавляется в табличную переменную @res; после чего добавленное значение удаляется из списка. Этот алгоритм повторяется в цикле до тех пор, пока в списке обнаруживается запятая.

Решение XML:

CREATE PROC usp_LoopVersion @CSV VARCHAR(MAX)
AS
SET NOCOUNT ON
DECLARE @idoc INT
--Раздел A
SET @CSV ='<root><x val="'+replace(@CSV,',','" /><x val="')+'" /></root>'

EXEC sp_XML_preparedocument @idoc OUTPUT, @CSV

SELECT *
FROM OPENXML (@idoc, '/root/x',1)
         WITH (val VARCHAR (100) )

EXEC sp_XML_removedocument idoc

Я заменил запятые на " /><x val=", поэтому в Разделе A @CSV будет представлять допустимое выражение XML. После этого я вызываю sp_XML_preparedocument для получения обработчика документа, который затем передается в OPENXML. Вызов sp_XML_removedocument - критический момент. Без этого документ останется в памяти.

Для тестирования хранимых процедур запустите следующий пример кода:

DECLARE @i int
DECLARE @CSV varchar(max)

set @i=0
while @i < 2
begin
     SET @CSV=isnull(@CSV+',test','test ' )
     set @i=@i+1
end

print @CSV
exec usp_LoopVersion @CSV
exec usp_LoopVersion @CSV

Отметим, что Вы можете использовать любой разделитель вместо запятой или, если Вам нравится, то можете передавать разделитель как параметр, - пример, который я оставляю Вам. Вы также можете загрузить код хранимой процедуры отсюда: code.txt

Производительность:

На моей машине со списком из 10 000 разделенных запятыми значений, версия XML управлялась на 3 секунды быстрее, чем версия с циклом.

Заключение:

XML в SQL Server 2005 получил дальнейшее развитие, и Microsoft добавила новые возможности, например, тип данных XML и спецификатор MAX. Я попытался показать Вам некоторые варианты использований XML, которые могут оказаться практичными в реальном мире. Я надеюсь, что эта статья дала вам новые знания.

22.02.2007

Полезная информация

§ Все статьи, публикуемые в рассылке, затем выкладываются на сайте Книги и статьи по SQL.

§ В продаже еще имеется книга SQL. Задачи и решения, посвященная анализу ошибок, допускаемых при решении задач первого этапа. На сайте издательства Питер можно сделать заказ и познакомиться с содержанием.

§ Желающих поспособствовать популяризации сайта прошу проголосовать/поставить закладку в социальных сетях:
del.icio.us
dzone.com
Digg.com

Контакты

По всем вопросам, связанным с функционированием сайта, проблемами при решении упражнений, идеями вы можете обращаться к Сергею И.Моисеенко msi77@yandex.ru. Вы также можете предложить свои задачи для публикации на сайте.

Подписка Subscribe.Ru
Новости сайта "Упражнения по SQL"

В избранное