Включение дубликатов в ГДЕ ... В? - PullRequest
0 голосов
/ 14 ноября 2018

Я хочу использовать простой запрос для уменьшения значения в таблице, например:

UPDATE `Table`
SET `foo` = `foo` - 1
WHERE `bar` IN (1, 2, 3, 4, 5)

Это прекрасно работает в примерах, подобных приведенным выше, где список IN содержит только уникальные значения, поэтому в каждой соответствующей строке столбец foo имеет уменьшенный на 1.

Проблема в том, что в списке есть дубликаты, например:

UPDATE `Table`
SET `foo` = `foo` - 1
WHERE `bar` IN (1, 3, 3, 3, 5)

В этом случае я бы хотел, чтобы строка, в которой bar было 3, была уменьшена в три раза (или в три раза), а 1 и 5 была бы уменьшена на 1.

Есть ли способ изменить поведение или альтернативный запрос, который я могу использовать, чтобы получить желаемое поведение?

Я специально использую MySQL 5.7, если есть какие-либо обходные пути, специфичные для MySQL.

Обновление : я строю запрос на языке сценариев, поэтому не стесняйтесь предлагать решения, которые выполняют любую дополнительную обработку перед выполнением запроса (возможно, в виде псевдокода, чтобы быть столь же полезным для сколько возможно?). Я не возражаю против этого, я просто хочу максимально упростить запрос и дать ожидаемый результат.

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Это немного сложно, но вы можете сделать это путем агрегирования:

update table t join
       (select bar, count(*) as factor
        from (select 1 as bar union all select 3 as bar union all select 3 as bar union all select 3 as bar union all select 5
             ) b
       ) b
       on t.bar = b.bar
    t.foo = t.foo - bar.factor;
0 голосов
/ 14 ноября 2018

Если вы можете сначала обработать свой исходный список, чтобы получить количество, вы можете динамически построить такой запрос:

UPDATE `Table`
SET `foo` = `foo` - CASE `bar` WHEN 1 THEN 1 WHEN 3 THEN 3 WHEN 5 THEN 1 ELSE 0 END
WHERE `bar` IN (1, 3, 5)
;

Примечание: ДРУГОЕ просто тщательное / параноидальное; ГДЕ должно препятствовать тому, чтобы это когда-либо заходило так далеко.

0 голосов
/ 14 ноября 2018

Существует пример, который может быть полезен для вашей цели:

create table #temp (value int)
create table #mainTable (id int, mainValue int)

insert into #temp (value) values (1),(3),(3),(3),(4)
insert into #mainTable values (1,5),(2,5),(3,5),(4,5)

select value,count(*) as AddValue
into #otherTemp
from #temp t
group by value

update m
set mainValue = m.mainValue+ ot.AddValue
from #otherTemp ot
inner join #mainTable m on m.id=ot.value

select * from #mainTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...