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

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

    Возможное решение - UNION ALL двух запросов. Первый - получающий список полей таблицы из INFORMATION_SCHEMA.COLUMNS в виде CSV, второй - собственно показанный запрос. Поскольку UNION ALL не перемешивает выходные записи, получится вроде бы то, что нужно.

    Однако есть грабли. Невидимые вычисляемые столбцы. Они будут присутствовать в списке полей, но не в наборе данных.

    См. fiddle
    Ответ написан
    Комментировать
  • Можно ли корректно заполнить создаваемое поле таблицы данными из другой таблицы?

    @Akina
    Сетевой и системный админ, SQL-программист.
    UPDATE TableA 
    SET tableB_Id = TableB.Id
    FROM TableB
    WHERE TableA.Name = TableB.Name;


    fiddle
    Ответ написан
    Комментировать
  • Как вернуть NULL если ничего не найдено в SQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Можно, конечно, использовать какую-нибудь дурь типа
    WITH cte ( поля ) AS (
        -- твой запрос
        )
    SELECT [ поля ] FROM cte
    UNION ALL
    SELECT NULL, ... , NULL WHERE NOT EXISTS (
        SELECT NULL FROM cte
        )


    Но, право слово...
    Ответ написан
    Комментировать
  • На сколько популярно и корректно хранить данные в столбце в виде JSON строки?

    @Akina
    Сетевой и системный админ, SQL-программист.
    На сколько популярно и корректно хранить данные в столбце в виде JSON строки?

    А это зависит от того, что с этими данными делать.

    Если сохранить/вернуть - да, вполне.
    Если найти по фрагменту - 50/50, и зависит в основном инструментов, имеющихся в конкретной СУБД.
    Если выполнить более сложную обработку (сумма, в т.ч. с накоплением, среднее, медиана и пр.) - скорее нет.
    Если использовать для связывания по фрагменту - почти наверняка нет.
    Ответ написан
    Комментировать
  • Как из массива получить данные поля cli_codes pl/sql?

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

    SELECT *
    FROM JSON_TABLE(cReq, 
                    '$' COLUMNS ( dep_id NUMBER(10) PATH '$.dep_id',
                                  id NUMBER(10) PATH '$.id',
                                  cli_codes varchar2(500) FORMAT JSON PATH '$.cli_codes'
                                  )
                    ) jsontable

    JSON_TABLE() function
    Ответ написан
    1 комментарий
  • В какой базе данных лучше всего хранить данные для дашбордов?

    @Akina
    Сетевой и системный админ, SQL-программист.
    а что делать с реляционной бд

    А ничего. НЕ хранить ежедневные итоги. Только приходы и уходы. И самая первая запись - только приход (начальный баланс), если начинаем не с пустой кассы. А сумму с накоплением считаем непосредственно в запросе, в тот момент, когда потребовался отчёт.

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    Функция - это хранимый объект, который производит указанные действия по факту явного вызова, и возвращает вычисленный результат, тип которого описан в тексте функции. Код функции может также модифицировать и другие объекты.

    Триггер - это хранимый объект, который описывает реакцию на указанное событие. Обычно это событие изменения данных (удаление, вставка, обновление данных таблицы), реже (и не в каждой СУБД поддерживается) событие изменения метаданных (создание, изменение или удаление хранимых объектов или модификация их свойств). Данная реакция заключается в выполнении соответствующего кода (триггерной процедуры либо триггерной функции, зависит от СУБД). Выполняемый код может модифицировать как сами изменяемые объекты, действие над которыми вызвало срабатывание триггера (т.е. модифицировать выполняемые модификации), так и другие объекты. Триггер сам по себе ничего и никуда не возвращает, триггерная процедура тоже ничего не возвращает, триггерная функция - возвращает обновлённое состояние объекта, действие с которым вызвало срабатывание триггера.
    Ответ написан
    Комментировать
  • Как можно оптимизировать SQL запрос?

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

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

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

    Актуализация данных таблицы (точнее, её полный пересчёт) выполняется из триггерной процедуры на каждое событие изменения любой из используемых в запросе таблиц, если изменение связано с вашей системой (заодно можно выпилить оттуда не связанные с приложением записи). Поскольку работа по изменению указанных данных достаточно редкая по сравнению с запросами на получение данных, такая схема может дать определённый профит. Однако, поскольку процесс предусматривает полную очистку таблицы и заполнение её с нуля, следует избегать интерференции со стороны двух конкурентных процессов изменения. Для полной гарантии любые изменения следует проводить в изолирующей транзакции.

    Хотя как по мне, следует отделить систему безопасности Постгресса от авторизации в приложении. Мнение по данному вопросу от Everything_is_bad в комментарии - это не сарказм, а весьма правильное замечание.
    Ответ написан
    Комментировать
  • Как правильно хранить изображения в SQL и как правильно работать с ними в WPF проекте?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Ну вообще-то хранение изображений в полях базы данных считается антипаттерном... а по сути - это вообще худшее из возможных решений.

    Наилучшее решение - файлы хранятся в FileTables либо FILESTREAM, а в таблице лежат ссылки на них. Что приятно - при этом не надо распыляться с безопасностью, за ней следит SQL Server.

    Сравнение параметров для хранения больших двоичных...

    Можно, конечно, хранить файлы и в файловой системе. Но тогда вышеупомянутая безопасность разваливается на две независимые и несвязанные части... и обе требуют внимания и поддержки.

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    LIKE в принципе не пригоден для указанной операции. Это чисто текстовый оператор. В частности, он безусловно применяет к обоим операндам регистронезависимый collation - в этих условиях сравнение БИНАРНЫХ строк способно давать весьма неожиданные эффекты.

    Если надо работать именно с бинарными строками - всё плохо. В MySQL нет нормальных функций для работы с ними.

    Для решения задачи рекомендую преобразовать бинарную строку в шестнадцатеричное представление, укоротить до 40-символьного (что соответствует 20-байтовому бинарному значению), преобразовать обратно, и сравнить.

    WHERE CONV(LEFT(HEX('$entered_hash'), 40), 16, 10) = correct_hash


    К тому же такое условие SARGable.

    PS. В выражении
    WHERE '{value1}' = '{value2}' OR '{value1}' LIKE '{value2}%'
    первое условие заведомо лишнее (ведь если оно выполняется, то и второе тоже выполняется).
    Ответ написан
    7 комментариев
  • Как формировать сырые SQL запросы максимально эффективно?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Обычно если в запрос может быть передано значение, а может и нет, делают так:
    ... AND (column = {parameter} OR {parameter} IS NULL) ..

    При подстановке параметра сервер уже на этапе построения плана выполнения запроса, зная значение {parameter}, получит либо
    ... AND (column = {parameter} OR FALSE) .. ==> ... AND (column = {parameter}) ..
    либо
    ... AND (column = {parameter} OR TRUE) .. ==> ... AND (TRUE) ...

    PS. Чтобы не геморроиться с определением, когда ставить WHERE, начальный шаблон делают такой:
    SQL = "SELECT * FROM USERS WHERE 1=1 {} LIMIT %s OFFSET %s"

    и все дополнительные условия формируют в виде
    AND {условие}
    Тогда не надо оглядываться, первое это условие или нет.

    Само же условие 1=1 будет обращено в TRUE и отброшено опять-таки на этапе построения плана.
    Ответ написан
    2 комментария
  • Как составить sql запрос?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH
    cte AS (
      SELECT *, ROW_NUMBER() OVER (PARTITION BY document_id ORDER BY job_id DESC) rn
      FROM my_table
      )
    SELECT document_id, job_id, person_id
    FROM cte 
    WHERE rn = 1;

    И в качестве бонуса
    SELECT DISTINCT 
           document_id,
           MAX(job_id) OVER (PARTITION BY document_id) job_id,
           FIRST_VALUE(person_id) OVER (PARTITION BY document_id ORDER BY job_id DESC) person_id
    FROM my_table
    Ответ написан
    Комментировать
  • SQLite Как выбрать записи, текстовое поле которых содержит подстроку, регистронезависимо?

    @Akina
    Сетевой и системный админ, SQL-программист.
    LIKE регистронезависим.
    GLOB регистрозависим.
    REGEXP - как напишешь регулярку, так и будет.
    Ответ написан
    Комментировать
  • Как составить запрос на выборку авторов в SQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT *
    FROM Author
    WHERE NOT EXISTS (
        SELECT NULL
        FROM Book
        WHERE Author.Authorld = Book.Authorld
          AND Book.PublishDateTime >= CURRENT_DATE - INTERVAL 2 YEAR
        )
    Ответ написан
  • Как правильно построить запрос в БД?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT table1.*, 
           EXISTS ( SELECT NULL
                    FROM table2
                    WHERE table2.table1_id = table1.id
                       AND table2.date = @needed_date
                    ) AS row_exists
    FROM table1

    Если точная дата внутри месяца неизвестна, то
    WHERE table2.date BETWEEN @needed_month_1st_day AND @needed_month_last_day
    Ответ написан
    Комментировать
  • Как составить запрос sql?

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

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

    Вариант соответственно второй - считать все укрупнёнки в момент записи текущих данных. Удалять/чистить лучше отдельной эвент-процедурой, если старая укрупнёнка недельку полежит, никто не помрёт. Вопрос отдельных таблиц под разные укрупнёнки - только если их структура различна в зависимости от периода, иначе одна таблица и поле маркер - диапазон периода записи.
    Ответ написан
  • Как создать корректный SQL триггер?

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

    ??? Какое ещё "поле"? может, запись? ну так для этого существует INSERT ... ON DUPLICATE KEY UPDATE Statement.
    А триггеры - они для дела, а не для баловства..
    Ответ написан
    Комментировать
  • Как соединить строки в одну?

    @Akina
    Сетевой и системный админ, SQL-программист.
    MS Access не имеет функции групповой конкатенации.

    Проблема решается путём создания пользовательской функции и использования её в запросе.

    Function group_concat(category As String) As String
    With CurrentDb.OpenRecordset("SELECT [Цех] FROM [Имя таблицы] WHERE [Продукция] = '" & category & "'")
        group_concat = ""
        .MoveFirst
        While Not .EOF
            group_concat = group_concat & "," & ![Цех]
            .MoveNext
        Wend
        .Close
    End With
    group_concat = Mid(group_concat, 2)
    End Function

    Поскольку пользовательская функция - скалярная, и не агрегатная, её нужно оборачивать какой-либо агрегатной функцией.
    SELECT [Продукция], MAX(group_concat([Цех])) AS [Цех]
    FROM [Имя таблицы]
    GROUP BY [Продукция];


    PS. Конечно, функцию можно сделать более универсальной, передавая в неё имена таблицы и полей, а также маркер типа данных поля категории.

    ---
    Ну или взять готовую DConcat() от Patrick G. Matthews: https://www.experts-exchange.com/articles/2380/Dom...
    Ответ написан
    Комментировать
  • Как вывести из sql таблицы все строки с совпадающими значениями?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH cte AS (
        SELECT a, b, c, COUNT(*) OVER (PARTITION BY a, c) cnt
        FROM table
    )
    SELECT a, b, c
    FROM cte 
    WHERE cnt > 1
    Ответ написан
    1 комментарий