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

    При такой исходной постановке задачи это всегда будет три отдельных запроса. Другое дело, что их можно объединить через конструкцию sql UNION.

    Вот абстрактный пример:
    select
      display_name
      , 'Table one' as TableName
    from
      one
    where
      [display_name] = 'Искомое слово'
    union all
    select
      display_name
      , 'Table two' as TableName
    from
      two
    where
      [display_name] = 'Искомое слово'
    union all
    select
      display_name
      , 'Table three' as TableName
    from
      three
    where
      [display_name] = 'Искомое слово'

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

    Надо не только связать, но и вычленить уникальные данные без дублирования, здесь поможет инструкция DISTINCT:
    SELECT DISTINCT
      planet.*
    FROM
      planet
    INNER JOIN
      planet_resource
    ON
      planet_resource.planet_id = planet.id
    INNER JOIN
      planet_resource_person
    ON
      planet_resource_person.resource_id = planet_resource.id
    INNER JOIN
      people_planet
    ON
      people_planet.people_id = planet_resource_person.person_id
      AND people_planet.planet_id = planet.id
    WHERE
      people_planet.people_id = ID нужного человека
    Ответ написан
  • Как написать SQL-запрос: вывод пользователей, кто отменял дважды заказ в течение получаса?

    Ответ на поверхности. Поскольку Вы знаете отправную точку и точное условие для включения пользователя в статистику, то достаточно воспользоваться конструкцией INNER JOIN для поиска пар одинаковых событий в временном промежутке, например наподобие вот этого:
    SELECT DISTINCT
      orders.user_id
    FROM
      orders
    INNER JOIN
      orders AS canceledOrders
    ON
      canceledOrders.user_id = orders.user_id
      AND canceledOrders.status = orders.status
      AND canceledOrder.order_id <> orders.order_id
      AND canceled.timestamp - orders.timestamp BETWEEN 0 AND 1800
    WHERE
      orders.status = 'cancel'
    Ответ написан
    Комментировать
  • Как составить SQL запрос из нескольких таблиц?

    На самом деле всё простое, ведь у нас есть очень важное ограничение в каждой таблице в день только по одной записи... Что это может нам дать, поскольку в каждой из таблиц есть штамп времени, то в join условие нужно для всех трёх таблиц добавить равенство даты (год, месяц, день) между собой, тогда для всего массива датчиков будет формироваться ровно по одной строке на каждый день из диапазона. Предполагая, что штамп времени во всех таблицах назван одинаково, можно составить примерный запрос:
    SELECT pot_volt.room_id rid, pot_volt.pot_id pid,
     setp_volt voltTarget, raw_volt volt, -- pot_volt
     avg_amp amp, -- pot_power
     cr, caf2, -- bath_an
     metal_height meHeight, bath_height baHeight, temperature baTemp -- pot_bath
     FROM pot_volt
     JOIN pot_power ON pot_power.pot_id=pid AND pot_power.room_id=rid AND cast(pot_volt.date_stamp as date) = cast(pot_power.date_stamp as date)
     JOIN bath_an ON bath_an.pot_id=pid AND bath_an.room_id=rid AND cast(bath_an.date_stamp as date) = cast(pot_volt.date_stamp as date)
     JOIN pot_bath ON pot_bath.pot_id=pid AND pot_bath.room_id=rid AND cast(pot_bath.date_stamp as date) = cast(pot_volt.date_stamp as date)
     WHERE rid=1 AND pid=36 AND pot_volt.date_stamp BETWEEN 1497336487 AND 1498027687
     ORDER BY pot_volt.date_stamp DESC

    Это общая идея, поскольку мне не известны форматы нужных столбцов, возможно нужно немного адаптировать.
    Ответ написан
    Комментировать
  • T-SQL. Как сделать UPDATE записей в таблице, у которых совпадает, например, GroupID, но разные TypeID?

    UPDATE UserDestination
    SET
      Number = UserSource.Number
    FROM
      Users AS UserSource
    INNER JOIN
      Users AS UserDestination
    ON
      UserSource.GroupID = UserDestination.GroupID
      AND UserSource.TypeID = 1
      AND UserDestination.TypeID = 3
    Ответ написан
    Комментировать
  • Как составить такой SQL запрос?

    Для иерархии глубиной 6 элементов (максимум) подойдёт следующий запрос:
    SELECT
      t1.*
      , count(t2.id) AS count
    FROM
      table AS t1
    INNER JOIN
      table AS t2 on t1.id = t2.parent
    INNER JOIN
      table AS t3 on t2.id = t3.parent
    INNER JOIN
      table AS t4 on t3.id = t4.parent
    INNER JOIN
      table AS t5 on t4.id = t5.parent
    INNER JOIN
      table AS t6 on t5.id = t6.parent
    WHERE
      t1.parent IS NULL
    GROUP BY
      t1.id
    HAVING
      count(t2.id) >= 3
    Ответ написан
    Комментировать
  • Какой SQL запрос использовать для графика по часам?

    Если SQL сервер версии 2008 или старше, то можно сделать так:
    SELECT
        COUNT(DISTINCT [orderT].[user]) as [Orders]
        , [Hours].[Hour]
    FROM
        (
            VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23)
        ) AS [Hours]([Hour])
    
    LEFT OUTER JOIN
        [orderT]
    ON
       datepart(hh, [orderT].[date]) = [Hours].[Hour]
    WHERE
        [orderT].[Operation] LIKE 'newOrder'
        AND [orderT].[date] >= Convert(datetime, '2014-11-06 00:00:00') 
        AND [orderT].date < Convert(datetime, '2014-11-06 23:59:59')
    GROUP BY
        [Hours].[Hour]
    Ответ написан
    Комментировать