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

    @ponaehal
    Скажите, пожалуйста:
    1. Вам нужно держать одинаковыми две таблицы, а что с остальными таблицами? Они могут быть одинаковыми или должны быть разными?
    2. А что в MS SQLServer можно настроить репликацию для одной отдельно взятой таблицы?
    3. Рассматривали ли Вы вариант на нужную таблицу повесить триггер и по dblink изменять целевую таблицу в другой системе?
    Ответ написан
  • Как ускорить инсерты в базу sql?

    @ponaehal
    Меня смущает постепенное падение производительности.
    По моим, ничем не подтвержденным ощущениям, причина кроется в механизме поддержки транзакционности используемой вами базы данных.
    Вы пытаетесь вставить кучу записей в одной транзакции, механизмы поддержки отката транзакций (на случай выполнения команды rollback или падения сессии) требуют значительных ресурсов БД. Примерно на 100.000, этих ресурсов хватает, а затем начинается какой то трэш (нужно читать в зависимости от БД).
    Что бы я посоветовал для начала:
    1. Средствами администрирования БД, посмотреть на расходование ресурсов (понять на что расходуется).
    2. Если мои догадки подтвердятся то вам вряд ли поможет пакетная вставка (хотя в разных БД она может быть реализована по разному).
    3. Попробуйте вставить commit через каждые 50.000 записей. Тем самым Вы снимите нагрузку с механизмов поддержки отката транзакций.
    Ответ написан
    Комментировать
  • Как правильно протестировать добавление записей в справочник?

    @ponaehal
    Немного не по теме:
    Возможность удаления записей из справочника очень не очевидная штука.
    Ведь на эту запись могут ссылаться другие записи в данной системе.
    Даже если не ссылаются в данной системе, то может быть интеграция справочных данных с другими системами (мдм, хранилище и т.п.)
    ИМХО, лучше при попытки удаления записи, проставлять какой то флаг "неактивности". Записи с этим флагом не показывать в интерфейсе и не давать использовать (при необходимости вплоть до триггерного контроля)

    Теперь если по теме вопроса:
    Проверять надо на соответствие чему то, например тесткейсам, которые разрабатываются по ЧТЗ, спецификации программных требований или иным документам (грубо говоря, что заказали, то и проверяем).
    Если же речь о так называемых смоук-тестах, то я бы проверил дополнительно возможность распределения полномочий доступа , аудит. Но тут все зависит от ядра системы и его возможностей.
    Ответ написан
    Комментировать
  • Изучаю базы данных. В уроках используется MySQL. Можно ли заменить его на PostgreSQL без потери совместимости?

    @ponaehal
    Для того что бы понять/почувствовать язык SQL - вполне достаточно MySQL.
    Как только изучите 4 основные команды DML и парочку команд DDL, можно задуматься о различиях и о конкретной платформе. Сугубо ИМХО.
    Ответ написан
    Комментировать
  • Как составить такой запрос в временной таблице?

    @ponaehal
    Сей процесс называется транспонированием (см. тут). Делается он либо выражениями PIVOT/UNPIVOT, либо построением запроса типа
    select group_concat(if(v='a', c, null)) a, 
           group_concat(if(v='b', c, null)) b, 
           group_concat(if(v='c', c, null)) c
      from (select value v, Count(value) c
              from t1
            group by value ) temp

    Ну может еще как то можно...
    Ответ написан
    Комментировать
  • Как вместе проверять 2 условия в WHERE?

    @ponaehal
    Ну вы даете... Это все одно и тоже.

    Даже вот это
    SELECT * FROM (
    SELECT * FROM User
    WHERE id IS NULL) t2
    WHERE t2.name = 'google'

    оптимизатор почти любой реляционной БД превратит вот в это:
    SELECT *
    FROM User
    WHERE User.id IS NULL AND User.name = 'google'


    И вообще сам вопрос содержит абсолютно верный ответ. Решать вопрос пследовательности фильтрации предоставьте оптимизатору.
    Ответ написан
  • Как использовать if else в Join?

    @ponaehal
    Хех. В свое время использовал следующий лайфхак:

    SELECT ..... WHERE ..... AND publisher_type= 0
    UNION ALL -- важно не UNION, а UNION ALL (разницу погуглите)
    SELECT ..... WHERE ..... AND publisher_type <> 0
    Ответ написан
  • Как получить записи с максимальной ревизией?

    @ponaehal
    По полю id группировать в общем то бесполезно, т.к. для каждой записи оно уникально. Если без него, то так:
    SELECT departmentId, type, MAX(revision) from table_name GROUP BY departmentId, type
    Ответ написан
  • Как настроить кнопку для удаления записи из БД?

    @ponaehal
    Не силен в PHP, но вдруг подумалось что будет не айс если какой-нибудь доброжелатель в качестве id вам передаст строку вида: 1235" + "or 1=1" + ". ИМХО, надо бы как то залатать...
    Ответ написан
    Комментировать
  • Как защититься от SQL иньекции?

    @ponaehal
    + осторожнее использовать выражение LIKE
    + осторожнее с динамическим SQL

    т.е. следить за теми значениями которые могут принимать переменные из которых вы лепите выражения like или динамический sql
    Ответ написан
    Комментировать
  • Получить max() от результатов sub-query?

    @ponaehal
    Примерно так:
    SELECT Max(max_fast_jackpot, max_coinflip_jackpot) 
    FROM (
    SELECT *,
           (SELECT Coalesce(Max(won_amount), 0)
            FROM   `fast_games`
                   INNER JOIN `fast_bets` AS `winning_fast_bets`
                           ON `winning_fast_bets`.`id` =
                              `fast_games`.`winning_bet_id`
            WHERE  users.id = winning_fast_bets.user_id
                   AND `fast_games`.`state` = ?)
           AS `max_fast_jackpot`,
           (SELECT Coalesce(Max(won_amount), 0)
            FROM   `coinflip_games`
                   INNER JOIN `coinflip_bets` AS `winning_coinflip_bets`
                           ON `winning_coinflip_bets`.`id` =
                              `coinflip_games`.`winning_bet_id`
            WHERE  users.id = winning_coinflip_bets.user_id
                   AND `coinflip_games`.`state` = ?)
           AS `max_coinflip_jackpot`  )
    
    FROM   `users`
    WHERE  `id` = ?
    )
    Ответ написан
  • Как найти дублирующиеся подряд записи по признаку?

    @ponaehal
    Примерно(!) так:
    SELECT  * FROM 
    (
    select 
      ID
    , LEAD(id) OVER (ORDER BY user_id)  lead_id
    from your_table
    ) tab
    WHERE tab.id= tab.lead_id
    Ответ написан
    2 комментария
  • Как сделать так чтобы запись добавлялся в начало бд?

    @ponaehal
    сами понятия "начало БД" и "конец БД" абсолютно неверны. Данные в большинстве реляционных БД хранятся в неотсортированном виде. СУБД сама решает "в какое место таблицы" вставить запись.
    Как уже правильно сказали коллеги выше, правильно добавить фразу ORDER BY <поле сортировки> <порядок сортировки - ASC|DESC> в тот запрос, который выводит Ваши данные в пользовательском интерфейсе.
    Ответ написан
    Комментировать
  • Как сделать подзапрос?

    @ponaehal
    SELECT `data`, `need`
    FROM `tab2`
    WHERE `id2` IN (SELECT id1 FROM  (SELECT `id1`,field1,field2  FROM `tab1` WHERE...) t)


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

    @ponaehal
    ИМХО (не проверял):
    CASE... END * 10 as date_value, date_value + tags_count as test
    Вы обзываете столбец и пытаетесь этот алиас тут же использовать. Видимо именно это не нравится интерпретатору.

    Сработает так:

    1. SELECT date_value, date _value*tags_count FROM (SELECT CASE... END as date_value , tags_count FROM "articles" ....)

    или так:
    2. SELECT
    CASE ... END as date value,
    CASE .... END *tags_count as date_value2
    FROM "articles" ....
    Ответ написан
    Комментировать
  • Как обьявить переменные в простом sql запросе?

    @ponaehal
    Про переменные надо говорить в контексте среды разработки в которой планируете выполнять запрос. Если говорить об SQLPlus, то как то так (слямжено с SQL.ru):
    SET DEFINE "&"
    VAR db_name VARCHAR2(30)
    COLUMN db_name NEW_VALUE db_name
    EXEC :db_name := 'Blah';
    SELECT :db_name AS db_name FROM dual;
    DEFINE db_name
    Ответ написан
  • Oracle + SQL + C++: какую среду разработки выбрать?

    @ponaehal
    Судя по описанию проблематики, выбор среды разработки - это не самая большая Ваша проблема :). Выбирайте любую, например, по наличию дистрибутива.
    Ответ написан
  • Как в mySQL найти id ряда по строковому значению?

    @ponaehal
    SELECT TOP 1 id FROM people WHERE name = 'Ann'
    Ответ написан
    Комментировать
  • Как извлечь набор данных из двух таблиц с разновременными параметрами?

    @ponaehal
    Хм... Для оракла я бы выкрутился так:
    SELECT  
    t2.datetime
    , param2
    , (SELECT param1 
      FROM
         (SELECT 
             t1.param1 
          ,  row_number() OVER(ORDER BY t1.datetime DESC)  rankparam1
          FROM table1 t1  
          WHERE t2.datetime>=t1.datetime)  
       WHERE rankparam1 = 1)
      as param1
    FROM table2  t2


    Полагаю в других база примерно так же.
    Но сильно не уверен что это будет достаточно быстро (даже если правильно расставить индексы).
    Ответ написан
    Комментировать
  • Как получить список чисел отсутвующих в базе PostgreSQL?

    @ponaehal
    ИМХО, если такой вопрос возник, то ВОЗМОЖНО что -то делаете не так. Вещать бизнес-смысл на IDб основная цель которых обеспечить уникальность - это в общем случае не очень правильно.
    Тем не менее...
    Возможно есть более красивое решение, но сходу не приходит в голову (для каждой БД оно будет свое).
    Общий подход:
    1. Создаем таблицу t2 с большим количеством строк и с одним полем num. В цикле заполняем ее значениями от 1 до n.
    2. В запросе минусуем исходную таблицу из t2
    SELECT t.num FROM t2
    EXCEPT
    SELECT t.id FROM base_table t
    все.

    ЗЫ Если таблицу делать лень, а число записей небольшое, то можно воспользоваться
    SELECT unnest(array[1, 2, 3, 4)
    Ответ написан
    1 комментарий