Ответы пользователя по тегу SQL
  • Не хочет связываться таблица почему?

    @Akina
    Сетевой и системный админ, SQL-программист.
    не пойму что ей надо

    Надо, чтобы в поле cat_id таблицы post уже присутствовало значение, которое ты присваиваешь полю id во вставляемой записи.
    Ответ написан
    1 комментарий
  • Как получить timestamp,обрезав пустое время?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Не делай так. Единообразие - это очень полезная штука. Если оставить нулевую компоненту времени, то конечному пользователю не придётся думать, действительно ли там нули, или время не отображается из-за какого-то косяка..
    Ответ написан
  • Как можно использовать Foreign Key?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Запомните одну вещь. Многие её забывают или не знают, и из этого проистекают все их проблемы.

    Внешний ключ (FOREIGN KEY) - это ПРАВИЛО. Всё остальное - либо дополнения, либо следствия. Народ начинает рассказывать про индексы и прочее - НЕТ! Не включайте всё это в определение собственно внешнего ключа.

    Хотя оно хранится в структуре таблицы, оно является не частью структуры таблицы, а инструкцией, которая будет обрабатываться подсистемой контроля целостности и непротиворечивости данных - есть такая в составе SQL-сервера.

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

    Это правило может быть дополнено опциями каскадной операции ON DELETE/UPDATE - в этом случае после контроля нового значения подсистема даёт дополнительную команду на выполнение указанных в опции изменений зависящих данных.

    Впрочем, создание внешнего ключа может и приводить к изменению структуры. Но не той таблицы, в которой создаётся внешний ключ, а в той, на которую этот ключ ссылается. дело в том, что для эффективной работы подсистемы контроля в ссылающейся таблице должен существовать индекс, который может и будет использоваться для эффективного контроля. То есть либо выражение внешнего ключа должно совпадать с выражением индекса, либо быть его префиксом. Некоторые СУБД при отсутствии такого индекса создают его автоматически, некоторые завершают попытку создания с ошибкой.

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    В синтаксисе MySQL:
    SELECT c.name category_name, p.id post_id, p.name post_name, p.title post_title
    FROM posts p
    JOIN categories c ON p.category_id = c.id
    UNION ALL
    SELECT name, NULL, NULL, NULL
    FROM categories 
    ORDER BY category_name, post_id IS NOT NULL

    Соответственно если в поле post_id обнаруживается NULL, то в этой записи категория, и она рисуется как категория. Если же там не NULL - то это пост, и он рисуется со смещением.

    Дурь, конечно, но для сельской местности сойдёт..
    Ответ написан
    1 комментарий
  • Как реализовать first_value(field) с фильтром на field внутри окна?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT 
      *,
      FIRST_VALUE(CASE WHEN banner_id IN (13,14,15,17)
                       THEN banner_id 
                       END) OVER (PARTITION BY id
                                  ORDER BY CASE WHEN banner_id IN (13,14,15,17)
                                                THEN banner_id 
                                                END DESC NULLS LAST) max_banner_id_1,
      FIRST_VALUE(CASE WHEN banner_id IN (4,177,178)
                       THEN banner_id 
                       END) OVER (PARTITION BY id
                                  ORDER BY CASE WHEN banner_id IN (4,177,178)
                                                THEN banner_id
                                                END DESC NULLS LAST) max_banner_id_2
    FROM test
    ORDER BY banner_id
    Ответ написан
    1 комментарий
  • Подсчёт кол-ва детей у сотрудников access?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Неправильный тип связи. Должно быть "все записи из Список и только соответствующие из Дети".

    Топнуть правым батоном точно в соединяющую линию, выбрать Параметры объединения. Итогово должна быть стрелка от Список к Дети.

    После этого - группировка по всем полям из Список и количество из Дети.
    Ответ написан
    Комментировать
  • Что такое PRIMARY KEY, CONSTRAINT, FOREIGN KEY, REFERENCES, INSERT INTO и для чего они нужны?

    @Akina
    Сетевой и системный админ, SQL-программист.
    PRIMARY KEY - первичный ключ. Поле, комбинация полей либо выражение (последнее MySQL не поддерживает), которое не может быть NULL и не допускает дубликатов (уникально для каждой отдельной записи в пределах таблицы). Поддерживается путём создания соответствующего уникального индекса и наложением ограничения NOT NULL на все используемые в выражении поля. По факту - однозначно идентифицирует запись. Кроме того, в MySQL выражение первичного ключа является кластерным индексом. См. Индекс -> Уникальный индекс -> Первичный индекс.

    CONSTRAINT - ограничение. Правило, которое не допускает создания записи, для которой значение выражения ограничения имеет значения FALSE (можно TRUE или NULL).

    FOREIGN KEY - внешний ключ. Ограничение, которое требует, чтобы указанное выражение для текущей записи присутствовало среди значений указанного выражения референсной таблицы (допускается и внешний ключ на ту же таблицу). Точнее, чтобы такая проверка присутствия не возвращала FALSE (можно TRUE или NULL).

    REFERENCES - определяет референсную таблицу и референсное выражение.

    INSERT INTO - запрос, вставляющий новые записи в таблицу.
    Ответ написан
    Комментировать
  • Выбрать строку из БД по значениям связанной таблицы?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT rule.id, rule.path, rule.content, rule.cat_id 
    FROM rule
    JOIN rule_options ON rule.id = rule_options.rule_id
    WHERE rule_options.option IN (4670, 5492)
    GROUP BY 1,2,3,4
    HAVING COUNT(DISTINCT rule_options.option) = 2;
    Ответ написан
    2 комментария
  • Как добавить запись в бд при условии, что она не была до этого добавлена?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Во-первых, надо создать в таблице уникальный индекс по полю, которое не должно содержать дубликатов.
    Во-вторых, надо использовать INSERT IGNORE INTO, чтобы дублирование одного значения не обваливало весь вставляемый массив. Либо REPLACE INTO, если при дублировании надо полностью заменить старую запись новой. Либо INSERT ODKU, если надо обновить старые данные новыми по некоей логике (например, вставить значения в поля, в которых раньше было NULL, а теперь пришло что-то определённое). Это - для MySQL, в других СУБД синтаксис с аналогичными возможностями будет иным.
    Ответ написан
  • Как работать с файлом SQL объемом 20 ГБ?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В комментариях выше фиксируются следующие факты:
    • используемая СУБД - MySQL
    • (вероятно) дамп - MySQL либо MariaDB
    • дамп поделен на несколько частей
    • задача - периодическая

    Соответственно некоторые соображения в дополнение к сказанному ранее.

    Если дамп выполнялся штатной утилитой (вряд ли иначе), то он содержит кучу комментариев, которые позволяют без особых проблем поделить дамп на отдельные файлы - дамп только структуры и дамп только данных. Даже в автоматическом режиме (программно), и уж тем более вручную. Поскольку нужны данные только по пользователям, то после описанного выше разделения можно безболезненно вырезать всё ненужное из дампа структуры (лишние таблицы, всякие процедуры-функции-триггеры, индексы и внешние ключи - всё это нафиг не нужно при восстановлении, а если нужно для эффективности выборки, лучше создать индексы после заливки данных), а также просто убрать дампы данных ненужных таблиц. И скорее всего объём информации для восстановления после такой чистки уменьшится на порядок, а то и больше.
    Ответ написан
    Комментировать
  • Что лучше, по одной или несколько записей при INSERT?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Запись пакетом быстрее и менее нагрузочна, но выше вероятность потери при сбоях.

    PS. 40 записей в секунду - это в общем-то ни о чём..
    Ответ написан
    Комментировать
  • Какой sql запрос нужен чтобы получить последнюю дату события для каждого домена?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH cte AS (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY domain ORDER BY date DESC) AS rn
        FROM Crawl_Datetime
    )
    SELECT * 
    FROM cte
    WHERE rn = 1
    Ответ написан
    Комментировать
  • В чем состоит разница между "WHERE" и "AND" в LEFT JOIN?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В чем состоит разница между "WHERE" и "AND" в LEFT JOIN?

    Тем, что AND operator может использоваться в том месте запроса, где он оказывает влияние на связывание с использованием LEFT JOIN (в составе выражения в ON clause), тогда как WHERE keyword в принципе не может использоваться в таком месте.
    Ответ написан
    Комментировать
  • "Incorrect syntax near '18'. Unclosed quotation mark after the character string ')'." что с этим делать?

    @Akina
    Сетевой и системный админ, SQL-программист.
    $" Values(N'{NAZVD.Text}', N'{SLOZHD}', '{dateTimePicker2.Value.ToString("yyyy/MM/dd")}, N'{comboBox1.SelectedValue}', N'{VIDD.Text}')";
               ^---- 1 -----^   ^--- 2 --^  ^----------------------- 3 -----------------------^                         ^-4-^           ^----- ???
    Ответ написан
    1 комментарий
  • Как отсортировать по столбцу данные, при этом чтобы имя столбца было взято из другого столбца?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В коде SQL запрос выглядит так:
    SELECT ANY_VALUE(title) AS title_list,
           SUM(count_model) AS count_model,
           COUNT(*) AS total,
           ANY_VALUE(created_at) AS `date`
    FROM mymodels
    GROUP BY name_list
    ORDER BY name_list;

    https://dbfiddle.uk/tiX1HDll

    Возможно вместо ANY_VALUE использовать MIN/MAX, это не изменит результата, хотя и противоречит логике.
    Ответ написан
    3 комментария
  • Как написать SQL запрос, чтобы при нахождении одной записи с определенным значением поля, другие записи с таким же значением не выводились?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Общий шаблон такой:

    SELECT article_id
    FROM tag2article
    GROUP BY article_id
    HAVING !SUM(tag_id = 1)


    Подобный подход позволяет формировать условия любой степени сложности, например:
    SUM(tag_id = 2) -- наличие тега 2 обязательно
    SUM(tag_id IN (3,4)) -- наличие хотя бы одного из указанных тегов обязательно
    !SUM(tag_id IN (5,6)) -- отсутствие любого из указанных тегов обязательно
    SUM(tag_id IN (7,8)) = 1 -- обязательно наличие строго одного из двух указанных

    Ну и так далее... а с учётом того, что такие условия объединяются логическими операторами, можно состряпать фильтр практически любой сложности.

    Конечно, в более простых случаях можно использовать и частные решения, и они будут быстрее общего. Вот как Сергей Паньков предложил.
    Ответ написан
    Комментировать
  • Как получить колонку по ее значение?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Да тупо проверить все... DEMO fiddle (ищется строго одна единица в поле на всю таблицу). Возвращается имя первой по списку колонки, которая соответствует заданному критерию, либо 'none', если ни одна колонка не соответствует.

    SELECT CASE WHEN SUM(CASE WHEN col1 = 1 THEN 1 END) = 1 THEN 'col1'
                WHEN SUM(CASE WHEN col2 = 1 THEN 1 END) = 1 THEN 'col2'
                WHEN SUM(CASE WHEN col3 = 1 THEN 1 END) = 1 THEN 'col3'
                ELSE 'none'
                END where_only_one_1
    FROM test;
    Ответ написан
    Комментировать
  • Где ошибка в данном sql запросе?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если нормально отформатировать, получается
    SELECT *
    FROM (
        SELECT toStartOfInterval(time_local, interval 3600 SECOND) AS interval,
               remote_addr,
               count(DISTINCT http_user_agent),
               count(http_user_agent)
        FROM accesslog.default
        WHERE time_local > (now() - toIntervalMinute(240))
        GROUP BY interval, remote_addr
        ORDER BY interval, remote_addr
        ) AS t1
    INNER JOIN (
        SELECT *
        FROM accesslog.default
        WHERE time_local > (now() - toIntervalMinute(240))
        ) AS t2 ON t1.remote_addr=t2.remote_addr

    Так хорошо видно, что к собственно запросу претензий быть не должно.

    А то, что сам кликхаус в процессе выполнения протерял одно поле подзапроса - это именно к нему, а не к запросу, претензии.. может, данных многовато, а оперативки в обрез?
    Ответ написан
    Комментировать
  • Как объединить 2 SQL запроса в один?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT *
    FROM ( запрос1 ) AS subquery1
    JOIN ( запрос2 ) AS subquery2 USING (departments)

    ORDER BY из подзапроса, само собой, убрать - но, возможно, добавить в объединённом запросе.
    Ответ написан
  • PostegreSQL. Как правильно создать структурированную таблицу с select?

    @Akina
    Сетевой и системный админ, SQL-программист.
    CREATE TABLE log AS (
      WITH cte AS (
        SELECT STRING_TO_ARRAY(txt, ' ') parsed
        FROM t1
      )
      SELECT LEFT(parsed[2], 8) :: DATE dt,
             parsed[3] link,
             ARRAY_TO_STRING(parsed[6:100], ' ') agent,
             t2.city
      FROM cte
      LEFT JOIN t2 ON cte.parsed[1] = t2.ip
      );

    fiddle

    PS. Нужны конкретные типы данных в итоговой таблице - добавь соотв. приведение типов в SELECT, как сделано для поля dt.
    Ответ написан
    Комментировать