• SQL Server Integration Services (SSIS) для начинающих – часть 3
    0
    Спасибо за понимание!
    Времени ушло действительно немало, и очень надеюсь, что оно было потрачено не зря и материал окажется многим полезен. ;)
    Спасибо так же моей семье, которая понимала и поддерживала меня все это время, мирясь с моей «недоступностью» и временами терпя меня такого «противного».
  • Используем TSQL для игры в «Судоку»
    +1
    Получил еще прирост в скорости, за счет уменьшения длины идентификатора варианта:
    -- получаем допустимые цифры в пустых ячейках
    SELECT
      -- формируем идентификатор варианта - укорачиваем его для более быстрого поиска
      RIGHT(CONCAT('0',CAST(CellNo AS varchar(2)),CHAR(ASCII('a')+Value-1)),3) ID,
    

    Теперь решение находится в пределах 6 секунд:
    • Пример 1: 4.547 сек.
    • Пример 2: 5.317 сек.
    • Пример 3: 3.690 сек.

    Думаю, на этом поставлю точку.
  • Используем TSQL для игры в «Судоку»
    0
    Добавив условие:
    WHERE i.CellNo<@NextCellNo -- выше проверять нет смысла
      AND t.VariantPath LIKE '%'+i.ID+'%'
    

    Уменьшил время выполнения почти в 2 раза:
    • пример 1 — 6.157 сек.
    • пример 2 — 6.607 сек.
    • пример 3 — 4.847 сек.
  • Используем TSQL для игры в «Судоку»
    0
    Да, красивое и быстрое решение.
    Проверил запрос для Oracle на тех же вариантах — решает в пределах 4-х секунд:
    1) 1.079 сек. (мое решение — 10.930 сек.)
    2) 2.991 сек. (мое решение — 12.970 сек.)
    3) 3.037 сек. (мое решение — 9.047 сек.)

    Oracle запрос...
    with x( s, ind ) as
    ( select sud, instr( sud, ' ' )
      from ( select '   15     34    89        3 2  6 8   47  9     9 2   11    2  5   9            74' sud from dual )
      --from ( select ' 71 9 8     3 6   49    7 5 1 9     9 2   6 3     8 2 8 5    76   6 7     7 4 35 ' sud from dual )
      --from ( select '      7     9 42 3 4 8 5     7 1 6  9          3    5262       7    3  9     8   ' sud from dual )
      union all
      select substr( s, 1, ind - 1 ) || z || substr( s, ind + 1 )
           , instr( s, ' ', ind + 1 )
      from x
         , ( select to_char( rownum ) z
             from dual
             connect by rownum <= 9
           ) z
      where ind > 0
      and not exists ( select null
                       from ( select rownum lp
                              from dual
                              connect by rownum <= 9
                            )
                       where z = substr( s, trunc( ( ind - 1 ) / 9 ) * 9 + lp, 1 )
                       or    z = substr( s, mod( ind - 1, 9 ) - 8 + lp * 9, 1 )
                       or    z = substr( s, mod( trunc( ( ind - 1 ) / 3 ), 3 ) * 3
                                          + trunc( ( ind - 1 ) / 27 ) * 27 + lp
                                          + trunc( ( lp - 1 ) / 3 ) * 6
                                       , 1 )
                     )
    )
    select s
    from x
    where ind = 0
    

  • Используем TSQL для игры в «Судоку»
    0
    Здесь, согласен с вами – для компьютера это очень долго.

    Мое решение – решение в лоб, сделанное на скорую руку. Основная цель была получить правильный результат за приемлемое время, при этом затратив минимум своих мыслительных ресурсов – решение находится при помощи 2-х основных несложных запросов и одного цикла.

    Решение получено, теперь есть куда стремиться. ))
    Думаю, основные тормоза происходят из-за выражения «t.VariantPath LIKE '%'+i.ID+'%'».
  • Используем TSQL для игры в «Балду»
    0
    Вот и я обзавелся своим решением судоку — статья. ))
  • Используем TSQL для игры в «Балду»
    +1
    Хорошая идея, как-нибудь нужно будет тоже попробовать.
    Я не большой любитель судоку, но в таком варианте для меня это достаточно интересная задача. ))
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть пятая
    0
    Добавил новый раздел — «Приложение 2 – OVER и аналитические функции».
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть пятая
    0
    Добавил новый раздел посвященный конструкции OUTPUT — «Использование конструкции OUTPUT».
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть пятая
    0
    Спасибо, что подняли этот вопрос!

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

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

    Но у конструкции OUTPUT, я думаю, есть и более важное предназначение – она позволяет не только получить, но и зафиксировать (OUTPUT … INTO …) информацию о том, что уже произошло по факту, то есть после выполнения операции модификации. Она может оказаться больше полезна в случае логированния произошедших действий, в некоторых случаях, можно это использовать, как хорошую альтернативу тригерам (для прозрачности действий).
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть пятая
    +1
    Пожалуйста!
    Для тех, кто дошел до конца, решил дописать еще один раздел «Приложение – бонус по оператору SELECT».
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть пятая
    +1
    Пожалуйста! Мне очень приятно это слышать! Рад, если материал оказался вам полезным!
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть четвертая
    0
    Спасибо за комментарий!

    Да, я знаю, что при помощи APPLY можно вызывать функции, возвращающие TABLE, но и в таком виде их можно иногда использовать. Учебник посвящен именно теме чистого SQL (без применения TSQL) и в большей степени для людей, только начинающих его изучать. Первым делом я пытался донести понимание сути именно базовых конструкций, на них и сделан в первую очередь основной упор – три части посвящено именно им и только один раздел посвящен теме подзапросов, потому что на больших наборах они действительно очень неэффективны.

    Я и сам стараюсь как можно реже прибегать к использованию подзапросов, поэтому я написал:
    Но я бы рекомендовал в первую очередь всегда пытаться решить задачу стандартными конструкциями оператора SELECT, и, если этого не получается, прибегать к помощи подзапросов.
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть четвертая
    0
    За счет того что в первом случае выполнится 2 подзапроса (один для получения emp.ID, а второй для emp.Name) для каждой строки, а в случае APPLY только один (и emp.ID и emp.Name получаются одним подзапросом).

    Вот планы обоих запросов:
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть третья
    0
    Всему, свое время. Про подзапросы, я скорее всего, буду рассказывать в следующей части, и не в первую очередь, а где и как их применять это уже насколько хватит фантазии. ;) Я специально пока не затрагивал их, т.к. с подзапросами, начинающие, без знания других основных возможностей оператора SELECT, порой такие трехэтажные конструкции могут нагородить…

    В вашем примере, вы наверно хотели сказать, что-то типа:

    SELECT DepartmentID,SUM(Salary) SalaryAmount
    FROM Employees emp
    GROUP BY DepartmentID
    HAVING EXISTS(SELECT * FROM Departments dep WHERE dep.ID=emp.DepartmentID)
    


    или

    SELECT DepartmentID,SUM(Salary) SalaryAmount
    FROM Employees emp
    GROUP BY DepartmentID
    HAVING (SELECT TOP 1 dep.Name FROM Departments dep WHERE dep.ID=emp.DepartmentID ORDER BY dep.Name)=N'ИТ'
    


    ?

    Примеры в данном случае абсолютно абстрактные и не несут какого-то определенного смысла.

    В случае использования EXISTS, нет смысла писать (SELECT TOP 1), достаточно (SELECT *), оптимизаторы современных СУБД (по крайней мере могу судить по MS SQL и Oracle), воспримут это абсолютно одинаково.
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть вторая
    0
    Добавил раздел посвященный этой теме — «Немного о числах и их преобразованиях».
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть вторая
    0
    Большое спасибо, что уделили свое время!

    Да, здесь вы правы, в зависимости от преобразуемого типа данных и возможности использования разных стилей, функция CONVERT может возвращать разный результат. Причем, для каждого типа данных может использоваться свой набор стилей. Конечно, в случае преобразования целого числа в вещественное (которое я привел в целях демонстрации целочисленного и вещественного деления) это не так критично, но в некоторых случаях это действительно важно, например, в указанном вами случае, когда делается преобразование числового значения в строку (varchar).

    Про функции CAST, CONVERT и стили можно подробно почитать в MSDN – «Функции CAST и CONVERT (Transact-SQL)»: msdn.microsoft.com/ru-ru/library/ms187928.aspx

    Хотел расширить ваш пример и показать в виде комментария, но объем для комментария получился немного большим. Поэтому, давайте я добавлю небольшой раздел про нюансы преобразования непосредственно в статью. Возможно данная информация, кому-то будет полезна.
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть вторая
    +1
    Попробовал, у меня результат одинаков:

    SELECT
      CAST('25.2525' AS float), -- 25.2525
      CONVERT(float,'25.2525') -- 25.2525
    


    У меня MS SQL 2014.
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть вторая
    0
    Спасибо! Очень полезное дополнение. Я как-то совсем забыл об этом.
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть вторая
    0
    Нет, функции CONVERT и CAST ведут себя аналогично, в этом можно убедиться выполнив простой тест:

    SELECT
      ID,
      CAST(ID AS float) Col1, -- float
      CONVERT(float,ID) Col2, -- float
    
      CAST(ID AS float)/100 Col3, -- float
      CONVERT(float,ID)/100. Col4, -- float
    
      ID*1. Col5, -- numeric(12, 0) - 0 знаков после запятой
      ID*1.0 Col6, -- numeric(13, 1) - 1 знак
      ID*1.00 Col7, -- numeric(14, 2) - 2 знака
    
      ID*1./100 Col8, -- numeric(18, 6)
      
      ID/1. Col9 -- numeric(16, 6)
    INTO _TestType -- посмотрите на столбцы этой таблицы
    FROM Employees
    


    А если мы используем (/1.) то идет неявное преобразование в тип numeric(16, 6) – оттуда и взялись шесть цифр после запятой, скорее всего вы это и увидели.

    Вообще на тему преобразований можно написать отдельный раздел, правда я не знаю стоит ли сейчас этим грузить начинающих? Т.к. я намерено не стал пока упоминать разные числовые типы, а разделил их просто на вещественные и целые. В первую очередь мне хочется донести суть конструкций языка DML.
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть первая
    0
    Спасибо за аргументированный ответ!
    Внес дополнения и сделал местами поправки. Как появится время еще раз пройдусь по тексту.
    Qbit, спасибо, что подняли этот вопрос!
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть первая
    0
    В данном случае, я считаю это не суть важно, по контексту ведь понятно, о чем идет речь.
    Ведь даже в разговорной речи, по большей части мы говорим «БД Oracle», или даже просто «Oracle», на самом деле подразумевая «СУБД Oracle». Если, мы хотим поговорить непосредственно о компании «Oracle» или «СУБД Oracle», со всеми его инструментами, мы же предварительно переключаем человека на этот или иной контекст, чтобы было понятно, о чем идет речь.
    Даже, если говорить вашими терминами, мы же обычно просто говорим «посмотри такую-то статью в интернет», а не посмотри такую-то статью через «Internet Explorer» или «Google Chrome».
    Думаю, дальнейший спор не имеет смысла.
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть первая
    –1
    Разве в данном случае это суть важно?
    Хорошо, попробуем порассуждать.
    Если говорить грубо, то БД – файл в котором данные хранятся в структурированном виде (в переводе на ваши термины – это интернет). Созданию данной структуры при помощи языка DDL и посвящена данная статья – мы создаем именно структуру БД и термин СУБД я считаю здесь ни причем.
    СУБД – система для работы с данным файлом (Internet Explorer).
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть первая
    0
    БД — непосредственно База Данных.
    СУБД — Система Управления этими БД.
    Почитайте на Википедии.
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть первая
    0
    Пожалуйста! Рад что материал оказался полезен и у вас все получилось.
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть первая
    0
    Спасибо за комментарий! Я добавил предложение, что временные таблицы так же можно удалять командой DROP TABLE, а также добавил немного новых заметок.
    В данной статье я пытался максимально полно охватить основы DDL в его чистом виде, и рассказать об этом в максимально сжатой форме. Поэтому, чтобы как можно меньше отступать от основной цели, я исключил всякого рода проверки, которые в MS SQL требуют использования расширения T-SQL (но, не исключено, что это станет темой отдельного разговора). К тому же думаю, столкнувшись с проблемой проверки существования объекта, человек сам, сможет достаточно легко найти решение, которое для разных БД так же может быть своим (где-то данные проверки могут непосредственно использоваться как опция, входящая в состав команд DDL – для примера, в MySQL можно использовать CREATE … IF NOT EXISTS или DROP … IF EXISTS).
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть первая
    0
    Спасибо за поправку!
  • Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть первая
    0
    Спасибо за комментарий! Поправил название темы.