#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 .
Примеры, просто выберите возвраты, которые имеют единицы 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