Выбор и подвыборка ОБНОВЛЕНИЕ тематических дисциплин Mysql x методы

#mysql #sql #select #sql-update #inner-join

#mysql #sql #выберите #sql-обновление #внутреннее соединение

Вопрос:

У меня следующий случай: у меня есть таблица «disciplines_units_technicians» со следующими столбцами:

  • discipline_id;
  • идентификатор единицы измерения;
  • технический _id;

Первоначально было два модуля, и был добавлен третий модуль, что привело к проблемам в ссылке «ТЕХНИЧЕСКИЕ МОДУЛИ X».

МНЕ НУЖНА ПОМОЩЬ ДЛЯ ВНЕСЕНИЯ СЛЕДУЮЩИХ ОБНОВЛЕНИЙ:

Сначала я выбираю таблицу:

ВЫБЕРИТЕ discipline_id ИЗ disciplines_units_technicians ГДЕ ?

Я хотел бы выбрать возвраты (повторяющиеся строки для 1, 2 и 3) с помощью unit_id = 1, 2 и 3 и из этого возврата внести ОБНОВЛЕНИЕ в регистр discipline_id, где:

ОБНОВИТЬ disciplines_units_technicians УСТАНОВИТЬ unit_id = ‘0’, где unit_id = ‘2’

И ГДЕ:

ОБНОВИТЬ disciplines_units_technicians УСТАНОВИТЬ unit_id = ‘2’ где unit_id = ‘3’

ТОЛЬКО идентификаторы «discipline_id», в которых у них есть 3 записи в таблице, то есть они включают unit = 1, 2 и 3, но я не знаю, как сделать выбор и подвыборку для обновления в этом случае, не РАССМАТРИВАЙТЕ возврат discipline_id с повторением только для unit = 1и 2, только если в возврате discipline_id есть unit = 3 .

Colum введите описание изображения здесь

введите описание изображения здесь

Примеры, просто выберите возвраты, которые имеют единицы 1, 2 и 3, и сделайте необходимые обновления pos

Комментарии:

1. У меня возникли проблемы с вашим описанием. Пожалуйста, добавьте образцы данных и желаемый результат.

2. Пересмотр вашего вопроса: итак, если у одного discipline_id есть 3 единицы, которые вы хотите обновить unit_id от 2 до 0 и от 3 до 2, это то, что вы хотите? для всех идентификаторов discipline_id в таблице. это правильно?

3. Я добавил пример в описание, спасибо,

Ответ №1:

Я думаю, это делает то, о чем вы просите:

 update disciplines_units_technicians dut
inner join (
    select discipline_id
    from disciplines_units_technicians
    where unit_id in (1, 2, 3)
    group by discipline_id
    having count(*) = 3
) dut1 on dut1.discipline_id = dut.discipline_id
set dut.unit_id = case when dut.unit_id = 2 then 0 else 2 end
where dut.unit_id in (2, 3)
 

В основном это фильтрует таблицу для discipline_id s, которые имеют все 3 unit_id s (1, 2 и 3), и обновляет unit_id 2 до 0 и 3 до 2.

Комментарии:

1. Спасибо, это логическое решение действительно работает и работает так, как ожидалось, в качестве ответа

Ответ №2:

Сначала протестируйте этот скрипт и посмотрите, соответствует ли результат тому, что вы хотите.

 SELECT [discipline_id]
      , CASE WHEN [unit_id] = 2 THEN 0
             WHEN [unit_id] = 3 THEN 2
       ELSE [unit_id] END AS [unit_id]
      ,[technical_id]
FROM (
SELECT [discipline_id]
      ,[unit_id]
      ,[technical_id]   
      ,COUNT([discipline_id]) OVER(PARTITION BY [discipline_id]) AS [counter]
  FROM [Test].[dbo].[disciplines_units_technicians]
  GROUP BY [discipline_id]
          ,[unit_id]
          ,[technical_id]) A
          WHERE [counter] > 2