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

    TheRonCronix
    @TheRonCronix
    Вот именно teams and users это разные сущности и перемешивать их нельзя. Поэтому и нужно в таблице participants сделать два foreign key. Отдельно на users и отдельно на teams.
    Ответ написан
    Комментировать
  • Как составить запрос по двум датам и по двум полям?

    TheRonCronix
    @TheRonCronix
    select user_id
    from projects as p
    where p.begin_date = current_date
      and not exists
      (
        select 1 
        from projects p2
        where p.begin_date - 30 <= p2.end_date and p.begin_date >= p2.begin_date
            and p.user_id = p2.user_id
            and p.id <> p2.id
      )
    Ответ написан
    1 комментарий
  • Сортировка по связующей таблице?

    TheRonCronix
    @TheRonCronix
    select company_name, poll_created_at
    from
    (
      select company.name as company_name, poll.created_at as poll_created_at,
        row_number() over (partition by company.name order by poll.created_at desc) as rn
      from ...
    )
    where rn = 1;
    Ответ написан
    Комментировать
  • Как совместить DELETE и LEFT JOIN?

    TheRonCronix
    @TheRonCronix
    Не совсем понятный вопрос. В students student_id = NULL, если академ у студента, тогда зачем джоинить по student_id ? Получается, нужно взять то, что нет в students и удалить из users:

    delete from users
    where id in
    (
    select id from users
    minus
    select id from students
    );

    Вариант с "not in" не очень, если у вас реально null в student_id. См. https://stackoverflow.com/questions/129077/not-in-...
    Ответ написан
    Комментировать
  • Oracle PL/SQL для изучения?

    TheRonCronix
    @TheRonCronix
    Сам pl/sql это лишь часть того что нужно знать. Oracle обширный. Oracle в своей реализации старается дотошно следовать всем стандратам, будь то работа с sql или xml, поэтому можно сугубо оринтрироваться под сам оракл. PL/SQL это ada-подобный язык, довольно простой, на самом деле. Изучить его и использовать не очень сложно.
    С точки зрения разработчика я бы выделил три направления в изучении:
    - изучение самой СУБД. Можно начать с Oracle database concepts.
    - изучение SQL. Тут все просто, в целом Oracle sql - это тот sql, что и везде. Есть, конечно, вариант собственного синтаксиса, но можно и в ANSI писать. что-то простого посоветовать не могу, для детального изучения можно прочитать OCA Oracle Database SQL Exam Guide.
    - изучение pl/sql. Есть много ресурсов, книг, официальная документация.
    Остальное - пакеты, опции - уже можно черпать из референсов и мануалов Oracle. Например в довесок можно изучить APEX для создания прикладных приложений.
    Стоит готовиться к большому кол-ву новой информации.
    Ответ написан
    2 комментария
  • Можно ли как-то динамически формировать pivot?

    TheRonCronix
    @TheRonCronix
    Не уверен, но скорее всего нет. Можно решить через динамический sql.
    Ответ написан
  • Как автоматизировать выполнение sql скрипта(vertica)?

    TheRonCronix
    @TheRonCronix
    Залить csv это хорошая идея.
    Эффект limit можно достичь аналитическими функциями, e.g.

    select * 
    from
    (
      select ROW_NUMBER() OVER (PARTITION BY t.city) as limit_num,
         t.city
         t. ...
      from
      (
        select city, ...
        from      my_table m   join   cities c   on   c.city = m.city
      ) as t
    ) tt
    where tt.limit_num <= 1000;
    Ответ написан
  • Как организовать поиск повторяющихся значений?

    TheRonCronix
    @TheRonCronix
    Как вариант:

    select distinct DocumentNodeValue, DocumentTemplateName, PatientName, d1.DocumentID, d2.DocumentID
    from
    (
    select DocumentNodeValue, DocumentTemplateName, PatientName, d1.DocumentID, d2.DocumentID, count(*) over(partition by DocumentNodeValue) as repeatitions
    from
    Patient
    join Course on PatientRef = PatientID
    join Document d1 on CourseRef = CourseID
    join Document d2 on d1.DocumentID = d2.DocumentID
    join DocumentTemplate on d1.DocumentTemplateRef = DocumentTemplateID
    join DocumentNode on DocumentRef = d1.DocumentID
    ) as tt
    where tt.repeatitions > 1;

    Логика такая: разбить весь массив строк на группы по значениям из DocumentNodeValue. В каждой из групп посчитать количество строк. Выдать все строки из массива с подсчитанным количеством. Взять только строки попавшие в группы, в которых насчитано более 1 строки. + distinct на ваше усмотрение.
    Ответ написан
    Комментировать
  • Order by distance. Как?

    TheRonCronix
    @TheRonCronix
    Посчитать можно, для этого придется пройтись по всем строкам таблицы и для каждой из точек высчитать расстояние до вашей точки, а потом отсортировать. Но, если нужно выбрать лишь несколько ближайших точек или просто точки не слишком удаленные от заданной, то можно воспользоваться техникой bounding-box: представить, что вокруг точки куб или квадрат заданного размера и провести вычисление сначала в границах куба. Это позволит хоть как-то задействовать индексы.
    Ответ написан
    Комментировать
  • Как поделить таблицу SQL на N частей и выполнить на каждой вычисления?

    TheRonCronix
    @TheRonCronix
    Даю идею (синтаксис не проверял):

    select mod(rn, N) part_number,
    t1.*
    from
    (
    select t.*,
    row_number() over() rn
    from table as t
    ) as t1

    N - кол-во частей, table - ваша таблица.
    Ответ написан
    Комментировать
  • Какой select написать, чтобы база данных зависла?

    TheRonCronix
    @TheRonCronix
    СУБД рассчитаны на то, чтобы не зависеть от клиентского приложения. В большинстве случаев, если не пул соединений используется, то под каждого клиента создается свой процесс. Можно легко завесить свой клиентский процесс, но не чужие. Однако, можно попробовать замедлить работу СУБД, влияя на разделяемые ресуры, например, вытеснить из кэша разобранные запросы путем генерации множетсва отличающихся запросов. Не факт, что сработает. Или блокировать доступ к таблице или процедуре путем ее перекомпиляции. Чтобы СУБД реально зависла, для этого нужен баг в СУБД. Но такие ситуации очень индивидуальны. На моей практике был только один такой случай, когда запрос ронял всю СУБД.
    Темой атак на СУБД я не занимался, но вопрос задали интересный.
    Ответ написан
  • Как называть первичный ключ?

    TheRonCronix
    @TheRonCronix
    Не составной ключ как столбец можно назвать просто id, можно имя_таблицы_id. На мой взгляд оба варианта допустимы.
    Важно скорее придерживаться одного стандарта, т.к. это благоприятно скажется при разного рода автоматизации.
    имя_таблицы_id может быть более выгоден в случае, если у вас есть две разные таблицы, но по смыслу имеющие один и тот же первичный ключ. Т.е. бизнес-смысл у него один. Также в выборках, где в качестве алиасов используются короткие одно-двух буквенные последовательности и выбирабтся несколько id, то может быть трудно понять какой id из какой таблицы. В целом я склоняюсь к варианту с осмысленными названиями, т.к. осмысленное название лучше, чем не осмысленное, т.е. я бы выбрал имя_таблицы_id.
    Сам же первичный ключ как констрейнт имеет смысл называть: pk_имя_таблицы
    Ответ написан
  • Как сделать МАССОВЫЙ UPDATE SQL запрос В ОДНУ СТРОКУ?

    TheRonCronix
    @TheRonCronix
    1. Сделать это в один запрос можно путем использования промежуточной таблицы. Сначала загрузите в БД данные из файла в эту таблицу, а затем одним запросом проведите update. Не забудьте собрать статистику на таблице после загрузки данных в нее из файла.
    2. Без вспомогательной таблицы: вам нужен индекс на поля sku, upc. Но это будет не в один запрос.
    Ответ написан
    Комментировать
  • Как составить SQL запрос на удаление лишнего?

    TheRonCronix
    @TheRonCronix
    Самый простой способ - использовать комбинацию функций instr/substr
    Ответ написан
    Комментировать
  • Как исправить ошибку в sql запросе?

    TheRonCronix
    @TheRonCronix
    Вероятно в слове "сategory" имеются нелатинские символы.
    Ответ написан
    Комментировать
  • Как облегчить запрос с множеством OR по поиску в одной таблице?

    TheRonCronix
    @TheRonCronix
    Вариантов оптимизации может быть несколько, в зависимости от версии СУБД, распределения данных. Например, можно сначала рассчитать свертку

    SELECT count(*), item_id, param_id, value
    FROM values_product
    GROUP BY item_id, param_id, value;

    сохранив ее в отдельную таблицу. И если ее размер гораздо меньше, чем размер таблицы values_product, запрос к ней будет работать быстрее.
    Ответ написан
    Комментировать