Ответы пользователя по тегу SQL
  • Как вычислить полный возраст по дате рождения?

    @Sumor
    The FROM_DAYS() function is to be used only with dates within the Gregorian calendar.
    В григорианском календаре нет нулевого года, поэтому даты меньше года не определяются.

    Для определения возраста я находил разницу между годом рождения и текущим годом, прибавлял её к дате рождения (таким образом получал нужный мне промежуточный результат - день рождения в текущем году), и сравнивал полученную дату и текущую (для отнимания единички, если ДР ещё не было).
    Ответ написан
    Комментировать
  • Как обеспечить уникальность данных в таблице?

    @Sumor
    CREATE UNIQUE INDEX PK_dic_id ON dic (dic_id) INCLUDE (dic_value)

    Этой командой вы создаёте уникальный индекс по полю dic_id. И уникальность обеспечивается только по этому полю. Поле dic_value включается в индекс дополнительно, для того, чтобы быстрее выполнять SELECT, в котором участвуют только эти поля.
    CONSTRAINT PK_dic_id PRIMARY KEY (dic_id, dic_value))

    Создаёт уникальный индекс с двумя полями, то есть уникальность обеспечивается на пару полей в совокупности. так как dic_id у вас уникальный, то уникальность обеспечивается независимо от значения dic_value.

    Правильно создать отдельный уникальный индекс на dic_value:
    CREATE UNIQUE INDEX IX_dic_value ON dic (dic_value)
    Ответ написан
    Комментировать
  • Есть ли смысл использовать checksum или hashbyte в JOIN'ах?

    @Sumor
    Самый верный способ узнать - это создать выборку и попробовать на ней.
    Предполагаю, что в большинстве случаев выигрывать будет первый вариант, хотя для таблиц меньше чем в десятки тысяч записей разница будет на уровне погрешности. База данных, скорее всего, будет эффективно использовать дату и число для предварительной фильтрации, и только после этого сравнивать текст. Поэтому второй вариант в любом случае проигрышный.
    Вычислять что-то во время выполнения запроса для всей таблицы вообще не очень хорошая идея.
    В некоторых случаях, если данных действительно очень много, то можно посчитать хеш заранее, построить по нему индекс и искать.

    PS. Для академического интереса можно построить БД и данные так, что каждый из трёх вариантов будет выигрывать.
    Ответ написан
    Комментировать
  • Как восстановить кодировку?

    @Sumor
    Символы отображаются в шестнадцатеричных кодах Win1251
    xC2xE5xEDxE5xF0xE0 это C2 E5 ED E5 F0 E0 это Венера
    Это значит, что в файле данные не испорчены преобразованиями. Просто их нужно прочитать в кодировке win1251.
    Вполне возможно, что если вы откроете файл с явным указанием кодировки win1251, например через notepad++, вы увидите правильные данные.
    Как их восстановить - пока неизвестно, так как вы не указали ни тип СУБД, ни как вы делали бекап.
    Ответ написан
  • Чем конвертировать sql в xls без поднятия сервера?

    @Sumor
    Я так понимаю - у вас файл со строками вида (INSERT INTO ...).
    Лучше, конечно, выполнить его на той БД, из которой вы её создали и от туда импортировать.
    Есть промежуточные варианты, но они могут не сработать по тем или иным причинам. Всё зависит от того что у вас есть.
    Вот вам пища для размышлений:
    Файлы Excel и CSV имеют свои odbc драйвера. Можно создать файл xls (xslx или csv). Затем подключить его к любому средству для выполнения запросов к БД, поддерживающему ODBC. И в этом средстве выполнить ваш файл со строчками INSERT. Необходимо только его преобразовать, чтобы он выполнялся (имена таблиц, колонок и т.д.).
    Средство импорта/экспорта MSSQL может подключиться к ODBC источнику, в том числе и к xls или csv файлу, и туда выполнить запрос.
    Современные версии Excel имеют в своём составе продвинутые средства работы с БД. Можно из него подключиться к файлу как к источнику данных и выполнить ваш SQL-файл в том или ином виде.

    Все варианты, кроме выполнения на БД, скорее всего потребуют определённой подготовки/переформатирования исходного файла.
    Ответ написан
    Комментировать
  • Как считать строку из ObservableCollection по заданным параметрам?

    @Sumor
    В combobox1.SelectedItem у тебя будет выбранный объект типа CreditsList.
    В простейшем случае:
    public void CreditsList_SelectionChanged(object sender, SelectionChangedEventArgs args)
            {
                if(combobox1.SelectedItem != null)
                    MessageBox.Show((combobox1.SelectedItem as CreditsList).credit_id);
            }
    Ответ написан
  • Почему нельзя использовать varchar для цифр?

    @Sumor
    Когда компьютеры были большими...
    В общем для записи больших чисел цифрами, с возможностью работать с каждым разрядом был придуман тип packed decimal или binary-coded decimal. Его поддержка до сих пор есть в современных процессорах. Смысл в том, что в каждых 4-х битах числа хранится цифра 0-9, значения A-F не используются. Выигрыш в хранении, по сравнению с varchar - в 2 раза.
    Можно развить эту тему и хранить цифры в массиве Int32, используя числа от 0-999999999 по 9 разрядов в каждом элементе. Для перевода в строку достаточно каждое число перевести в строку и соединить.
    Ответ написан
    Комментировать
  • Как предпочтительнее реализовать связи в БД?

    @Sumor
    Если вы сделаете идентификаторы каждого объекта уникальным в рамках своей БД, то вы можете обойтись одной таблицей связей и в JOIN не нужно будет дополнительно указывать тип связи.
    Например: Объекты типа A имеют идентификаторы вида A1, объекты типа B - B1 и тд. Тогда:
    Таблица A
    A1 Данные 1
    A2 Данные 2
    A3 Данные 3

    Таблица B
    B1 Данные 1
    B2 Данные 2
    B3 Данные 3

    Таблица C
    C1 Данные 1
    C2 Данные 2
    C3 Данные 3

    LNK Таблица связей
    A1 B1
    A1 B3
    C3 B2
    и тд

    Запрос на связи A и B (примерно, без синтаксического разбора):
    SELECT * FROM A JOIN LNK ON A.id = LNK.id1 JOIN B ON LNK.id2 = B.id

    Нужно ещё учесть, что при таком подходе у связей есть направленность: могут быть связи A1-B2 или B2-A1 и нужно иметь это ввиду: либо дублировать при добавлении, либо использовать другие подходы, либо может быть вам направленность связей как раз и нужна.
    Для идентификаторов можно использовать GUID - он гарантированно не будет пересекаться между таблицами, но что-бы определить тип объекта по GUID вам нужно прошерстить все таблицы.
    Ответ написан
    Комментировать
  • Есть ли смысл хранить байт в поле varchar(max) в данном случае?

    @Sumor
    varchar(max) блобовский тип. В SQLServer он хранится в отдельном от основной записи месте и не включается в ограничение 8kb на запись. По памяти занимает 2 байта + размер хранимого значения. Лучше, кстати, хранить в nvarchar, так как всё-таки уже век юникода.
    Если у вас данные до 4000 символов, лучше хранить в nvarchar(4000) - данных хранятся вместе с ключом.

    Пока у вас нет миллионов записей и нет жёстких ограничений на размер БД не усложняйте и храните так, как удобно программно обрабатывать.
    Ответ написан
    Комментировать
  • Вопрос знатокам SQL. Как исправить нехватку полученных данных (постранично) из-за дублирования при использовании JOIN?

    @Sumor
    Делаете сначала SELECT DISTINCT i.id всего вашего запроса без ORDER BY и LIMIT.
    А затем на основе полученных id формируете выдачу, например (но не обязательно только так), через WHERE i.id IN (вложенный SELECT с выбором id) уже с учётом ORDER BY и LIMIT.
    Ответ написан
    Комментировать
  • Стоит ли разнести данные в БД: на пользователя своя схема?

    @Sumor
    Работает - не трогай.
    А по сути, вопрос в том, что вас не устраивает в текущем хранении и насколько связаны данные разных пользователей.
    Если данные пользователей тесно переплетены, то есть Products, Items связаны с несколькими пользователями одновременно, но может нет смысла так заморачиваться.
    Если же данные пользователей наоборот разделены, то вы можете рассмотреть вопрос о создании под каждого пользователя своей БД. При заведении пользователя она будет создаваться, при удалении - удаляться, сохранение/восстановление/права - всё будет.
    Если хотите поиграться схемами, то лучше использовать не таблицы, а представления. На каждого пользователя создать представления в своей схеме с отбором только его записей и выставлением прав.
    Ответ написан
    Комментировать
  • Свойство ConnectionString не инициализировано. Как исправить?

    @Sumor
    Соединение у вас работает только в рамках using. Оно же его и закрывает.
    Либо нужно создавать и долго хранить SqlConnection, скорее всего всё время работы программы.
    Либо в обработчике ButtonSave_Click заново создайте SqlConnection и присвойте его свойству adapter.Connection.

    Пересоздание SqlConnection в короткий промежуток времени не приводит к физическому пересозданию соединения с базой данных, так как провайдер какое-то время после закрытия ещё держит соединения на случай если они понадобятся.
    Ответ написан
  • Почему в HAVING работают псевдонимы из SELECT?

    @Sumor
    HAVING накладывает условия на уже выполненный и отобранный запрос, в котором уже есть псевдонимы, а всё остальное работает перед окончательной выдачей, где псевдонимов ещё нет.
    Ответ написан
    Комментировать
  • Как обновить несколько строк в таблице?

    @Sumor
    Не мешало бы уточнить какой язык используете, ну да ладно.
    В целом, лучше генерировать запрос с параметрами, а затем их подставлять.
    Если число параметров неизвестно, то вы можете добавить их в цикле. Получится примерно следующее (результат будет зависеть от вашего языка).
    var query = "UPDATE products SET deleted = true WHERE id  IN(${p1}";
    for(var i = 2; i <= products.length; i++)
    {
        query += ", ${p" + i + "}"; 
    }
    query += ");";
    return db.query(query, products);

    Для вашего примера запрос должен получиться таким:
    UPDATE products SET deleted = true WHERE id  IN(${p1}, ${p2}, ${p3});
    Ответ написан
    1 комментарий
  • Разрастается журнал транзакции в MS SQl 2012? ,база в зеркале, как уменьшить журнал?

    @Sumor
    Что-бы журнал не рос нужно делать сохранение лога.
    То есть помимо зеркалирования, вы должны периодически сохранять базу данных и лог данных.
    Сохранение лога остановит разрастание файла лога. При этом сразу файл не удастся уменьшить, так как конец файла будет использоваться sql-сервером. Когда вы через какое-то время второй раз сохраните лог, то sql-сервер даст вам уменьшить файл.
    NB: для сохранения лога вам может понадобиться до 210 ГБ .
    Ответ написан
    Комментировать
  • Обновление Blob поля?

    @Sumor
    Если я правильно понял, то примерно так (имя таблицы, колонок подставите свои):
    UPDATE table
    SET
    [blob] = (SELECT [blob] FROM table WHERE id = 555)
    WHERE id != 555
    Ответ написан
    4 комментария
  • Как ускорить подключение к БД MS SQL (tedious + NODE) в AZURE?

    @Sumor
    1. Если у вас включён ipv6, но не настроен и не используется, то отключите его. Сначала имя компьютера резолвится по ipv6. В качестве теста попробуйте заменить имя сервера на его ip-адрес.
    2. Если у вас корпоративная сеть без выхода в интернет, то при подключении может проводиться проверка отзыва сертификата подключаемого сервера, которая будет пытаться подключиться к серверу проверки отзывов сертификатов. В этом случае эту проверку нужно отключить в системе.
    Ответ написан
    Комментировать
  • Как вывести таблицу из БД в TreeView WPF?

    @Sumor
    Нужно создать класс примерно такого вида:
    class Item
    {
      public string Name {get;set;}
      public IEnumerable<Item> Children 
      {
        get {/* тут код получения из базы подчинённых элементов*/}
      }
    }

    Получить список элементов верхнего уровня и присвоить ItemsSource у TreeView.
    У TreeView в описании шаблона для элемента (ItemTemplate) описать HierarchicalDataTemplate и указать свойство для получения подчинённых элементов в ItemsSource={Binding Children}.
    <TreeView>
      <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
          <TextBlock Text="{Binding Name}" />
        </HierarchicalDataTemplate>
      </TreeView.ItemTemplate>
    </TreeView>
    Ответ написан
    2 комментария
  • Какой "длины" может быть INSERT? Как импортировать 1 млн строк?

    @Sumor
    Прочитайте раздел документации и выполните рекомендации
    optimizing-innodb-bulk-data-loading

    Нужно максимально отключить дополнительную работу БД: автоинкременты, индексы, триггеры, констрейнты, если есть возможность загружать без транзакций (Bulk load).
    Может будет лучше загрузить во временную таблицу в памяти через load xml, а затем вставить в свою таблицу ерез insert into ... select ...
    Ответ написан
    3 комментария
  • Ошибки в RSS как исправить?

    @Sumor
    Возможно парсеру не нравится строка <?xml version="1.0" encoding="utf-8"?>
    Или по тексту есть незакрытый тег. Или есть ссылки на схему и у парсера нет к ней доступа.
    Ответ написан
    Комментировать