Задать вопрос
Ответы пользователя по тегу SQL
  • Почему нельзя использовать varchar для цифр?

    @d-stream
    Готовые решения - не подаю, но...
    Какой смысл прикручивания к велосипеду с квадратными колесами треугольных подшипников с бубенчиками?

    Начать необходимо с исходного - какие требования к значениям. Фраза "мне только хранить" может вообще спровоцировать на "не хранить". Или же далее будет хоть какое-то использование.

    А в нормальном варианте - decimal, либо real, но с четким пониманием чем реал хорош и чем плох.
    Ответ написан
    Комментировать
  • Как сделать каскадный SQL-запрос?

    @d-stream
    Готовые решения - не подаю, но...
    В чем проблема-то? Сотни тысяч строк - это для бд - не объем.
    Ответ написан
    Комментировать
  • Как сформировать 1 запрос UPDATE с тысячей значений?

    @d-stream
    Готовые решения - не подаю, но...
    Более-менее оптимальный вариант в близком решении (обновление прайсов на 0.5-20 миллионов позиций):

    1. из внешнего источника данные втягиваются во временную таблицу
    2. из временной таблицы в номенклатуру добавляются отсутствующие (новые) позиции
    3. временная таблица прореживается на предмет дубликатов
    4. временная таблица прореживается по ряду интерактивных условий (какие поля из нее использовать для обновления) - совпадающие удаляются
    5. пачками делается update - именно пачками, специфичными для каждого экземпляра sql сервера с его загрузкой, объемом памяти, скоростью дисковой подсистемы и т.п.

    экспериментальным путем - пришли где-то к размеру "пачки" в 50000...200000 строк

    ____________________________
    * речь о достаточно универсальном средстве для импорта разных прайсов разных брендов = в одном случае есть закупочные и продажные цены + классификация по группам скидок, где-то только базовая цена и т.п.
    Ответ написан
    Комментировать
  • Нужно ли создавать дополнительное поле AI поле id, если уже есть другое уникальное поле?

    @d-stream
    Готовые решения - не подаю, но...
    Вообще ноги растут из потребности иметь уникальное поле. Если нет значимого - тогда вводится искусственный "уникализатор" в виде автоинкрементного поля. Если же в таблице уже есть что-то уникальное искусственное образование большого смысла не имеет.
    Ответ написан
    Комментировать
  • Как посчитать количество записей по интервалам?

    @d-stream
    Готовые решения - не подаю, но...
    вначале тем или иным образом надо "классифицировать" записи по интервалам:
    - через case если они константные и их немного
    - через некую вспомогательную таблицу интервалов
    - через "округление" дат - типа day(), month() или diff/const

    т.е. в результате должна получиться таблица с колонкой interval_id - вот по нему уже и группировать
    Ответ написан
    Комментировать
  • Как пишутся сложные SQL запросы?

    @d-stream
    Готовые решения - не подаю, но...
    Форматирование и комментарии никто не отменял.
    В совокупности с внятным именованием таблиц, их алиасов и полей - это дает возможность одним взглядом понимать что это за запрос и зачем он.

    Ну и да, cte неплохо помогают не только оптимизатору, но и чтению кода.
    Ответ написан
    Комментировать
  • Удалить все кроме N последних записей с одним и тем же полем (SQL)?

    @d-stream
    Готовые решения - не подаю, но...
    Как удалить дубликаты строк в postresql? останется только TOP 1 заменить на нужное число ну и возможно перепилить на limit xx
    Ответ написан
    Комментировать
  • Как подгружать новости не в хронологическом порядке?

    @d-stream
    Готовые решения - не подаю, но...
    определится для себя что же важнее, что менее важно и указать это через запятую в order by

    p.s. where - это не сортировка, а отбор
    Ответ написан
    Комментировать
  • Что лучше триггер или процедура? И почему не запихнуть бы всю логику в процедуры?

    @d-stream
    Готовые решения - не подаю, но...
    Это ровно как с отвертками, молотками, гвоздодерами, напильниками - все они предназначены для разных действий. Иногда конечно получается забивать напильником саморез по металлу в гипсокартон, но он фиговато держится. Что совершенно не значит что гипсокартон - плохой материал или саморезу по металлу - плохи... тем паче нельзя пенять на напильник...

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

    p/s/ и да, триггеры бывают не только DML, но и DDL разных уровней + всяких специфичных видов типа event_driven, logon и т.п.
    Ответ написан
    Комментировать
  • Как удалить дубликаты строк в postresql?

    @d-stream
    Готовые решения - не подаю, но...
    Канва примерно такая:
    есть ip - primary key и dup_fld - поле, которое могло дублироваться
    1. select dup_fld from table group by dup_fld having count(*)>1 -- это дубликаты как таковые
    2. select max(id) from table group by dup_fld having count(*)>1 -- это id (уникальный, последний) в дубликатах
    3. само удаление по условию что dup_fld из 1 селекта и id НЕ из 2 селекта

    во втором селекте берем самый последний id - подразумевая, что id растут при добавлении и самое последнее добавление - самое верное, но можно брать min - тогда "самое первое оставить" или развивать конструкцию до нужной логики (типа цена ближе всего к среднему и т.п.)

    Ну а как реалезовать - вопрос вкуса и компромисса с оптимизатором. Я бы делал 2 cte - первым inner join "урезал" набор до только дубликаты, вторым - left join where cte2.id is null

    with cte_dbls(dup_fld) as (select dub_fld from table group by dup_fld having count(dup_fld)>1),
    cte_ones( id ) as ( select max(id)  from table group by dup_fld having count(dup_fld)>1)
    
    --delete from table where id in (
    
    select 
    id
    from table
    inner join cte_dbls on cte_dbls.dup_fld=table.dup_fld
    left join cte_ones on cte_ones.id=table.id
    where cte_ones.id is null
    --)


    Для удобства - само удаление закомменчено, чтобы увидеть результат селекта, а так можно избавится из конструкции where in
    Ответ написан
    Комментировать
  • Как составить такой SQL запрос?

    @d-stream
    Готовые решения - не подаю, но...
    select 
    table.id, min(table.name)
    from table
    left join table as t2 on t2.paren=table.id
    where table.parent is null
    group by table.id
    having count(t2.parent)>=3


    до MySQL доточить по вкусу и сдать домашнее задание -)
    Ответ написан
    Комментировать
  • На выполнении запроса выкидывается ошибка. В чем проблема?

    @d-stream
    Готовые решения - не подаю, но...
    И че получается?
    WHERE YEAR(hire_date) IN (
    SELECT MAX(salary), YEAR(hire_date)

    вложенный селект вернет ДВА столбца, и как sqlю быть с этим?
    Ответ написан
    Комментировать
  • Название таблицы в множественном числе или нет?

    @d-stream
    Готовые решения - не подаю, но...
    С учетом что может быть список клиентов и подробные данные клиента - возможно существование и таблицы clients и таблицы client (или client_data)

    В общем-то вопрос привычки и соглашений. Если работать в команде - то как правило существуют этакие style guide (иногда устные), которым сотрудники или стараются или обязаны следовать.
    Ответ написан
    Комментировать
  • Ошибка при создании Foreign Key?

    @d-stream
    Готовые решения - не подаю, но...
    Для начала:
    select * from rooms where rooms.id_room_size not in (
    select id_room_size from hotel.roomsize
    )
    Ответ написан
    3 комментария
  • MySQL, Хранимые процедуры и функции, как вернуть multiple rows?

    @d-stream
    Готовые решения - не подаю, но...
    Процедура может возвращать результат селекта. Я бы даже сказал чаще всего так и бывает. А вот возвращающие что-то одно (функции) - пореже.

    Как типичный вариант - на входе получает кучку параметров-фильтров, флагов, а на выходе вываливает селект с отбором, сортировкой, группировкой по этим флагам.

    Как тупой образчик отбор контактов:

    create procedure get_contacts (idescr char, itype int, show_hidden bit )
    begin
    ... делаем кучи каких-нибудь проверок
    и где-то в конце

    select ... from ... join ....
    where contacts.descr like idescr
    and (itype=0 or contacts.type=itype)
    and (show_hidden=1 or contacts.is_hidden=0)
    end

    вызвав процедуру с параметрами '%%', 0, 1 - получим всех контрагентов, '%%', 0, 0 - только тех у кого не взведен флаг "скрытый" и т.п.

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

    @d-stream
    Готовые решения - не подаю, но...
    Распространять можно как угодно. Если хочется чтобы программа распространялась - видимо как минимум стоит описать порядок, условия установки и т.п. Ну или частично или полностью поместить эту логику в инсталлятор.

    Применительно к MS SQL - видимо одним из вариантов - предлагать ставить express
    Ответ написан
    Комментировать
  • Как исправить ошибку "No connection associated with this command"?

    @d-stream
    Готовые решения - не подаю, но...
    Ну так логично. Соединение само по-себе, команда - сама по себе.

    Если просто посмотреть на описание SqlCommand (архитектура для SQLite - такая же) https://msdn.microsoft.com/ru-ru/library/system.da...

    то там можно увидеть следующее:

    using (SqlConnection conn = new SqlConnection(connectionString)) {
                using (SqlCommand cmd = new SqlCommand(commandText, conn)) {
                   // There're three command types: StoredProcedure, Text, TableDirect. The TableDirect 
                   // type is only for OLE DB.  
                   cmd.CommandType = commandType;
                   cmd.Parameters.AddRange(parameters);
    
                   conn.Open();
                   return cmd.ExecuteNonQuery();
                }
             }


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

    Ровно такой же пример приводится и в описании SQLiteCommand
    https://www.devart.com/dotconnect/SQLite/docs/Deva...

    public void ReadMyData(string myConnString)
    {
      string mySelectQuery = "SELECT DeptNo, DName FROM Dept";
      SQLiteConnection sqConnection = new SQLiteConnection(myConnString);
      SQLiteCommand sqCommand = new SQLiteCommand(mySelectQuery,sqConnection); // команда конструируется с указанием соединения!!!
      sqConnection.Open();
      SQLiteDataReader sqReader = sqCommand.ExecuteReader();
      try
      {
        while (sqReader.Read())
        {
          Console.WriteLine(sqReader.GetInt32(0).ToString() + ", " + sqReader.GetString(1));
        }
      }
      finally
      {
      // always call Close when done reading.
      sqReader.Close();
      // always call Close when done reading.
      sqConnection.Close();
      }
    }


    В общем ответ на вопрос "как исправить" один - понять суть.
    Ответ написан
    2 комментария
  • Как правильно написать sql?

    @d-stream
    Готовые решения - не подаю, но...
    select top 1 keys from (
    SELECT RelPage_Y AS RP
    FROM Keys
    WHERE (((Keys.mp_group)=388))
    UNION ALL SELECT RelPage_G AS RP
    FROM Keys
    WHERE (((Keys.mp_group)=388))
    )
    group by RP
    order by count(RP) desc


    то бишь результаты первого запроса
    группируем по ключу
    сортируем по убыванию count()
    берем только первую строку
    дальше к этому можно уже прицепить развернутое (join по key )
    Ответ написан
    1 комментарий
  • Дадите совет по построению БД?

    @d-stream
    Готовые решения - не подаю, но...
    Персона, если не заморачиваться со сменами фамилии, пола и т.п. - по сути одна, а эта персона во времени может приходить, уходить и т.п.

    Вот и напрашивается одна табличка с первичным ключом person_id и горой данных типа ФИО и т.п., а вторая слегка упрощенная табличка - этакая история (хронология) событий:
    датавремя, персона (person_id), действие (например int или enum)

    соответственно если взять первую запись по хронологии для конкретной персоны - увидим когда персона впервые появилась, по действию последней записи персоны - понимаем ее статус

    ну и всяческие "сколько в прошлом месяце пришло и сколько ушло" или сколько было френдов 143 дня назад" запросы лепятся в одну строчку... точнее вру, последний получится чуть посложнее
    Ответ написан
    1 комментарий
  • Как сформировать запрос?

    @d-stream
    Готовые решения - не подаю, но...
    Как говаривал один сантехник: "да тут всю систему менять надо".

    По-нормальному без приходного документа мешки цемента в свободном остатке не должны были появиться вообще.
    Ответ написан
    Комментировать