Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Update max из одинаковых кроме id значений  [new]
Bulgat
Member

Откуда:
Сообщений: 3
Добрый вечер.
Обычно хватает только описать проблему и решение само находится, но здесь я что то явно туплю

Мне нужно обнулить первое или второе значение из двух одинаковых пришедших, то есть грубо говоря
update set = 0 where id = (выбранное одно значение where (число одинаковых значений >1) )

Таблица1

ID Место Нулевость
346905 107797 1
346907 107797 1

Таблица2

ID Ключ Место Расположение
1694613 zs0001 107797 1
1694612 zs0001 107797 1

Собственно написал такое

UPDATE таблица1 SET
таблица1.Нулевость = 0
FROM таблица2
INNER JOIN таблица1
ON таблица2.Место = таблица1.Место
AND таблица1.Нулевость = 1
where таблица1.ID in
(select max(таблица1.Место)
FROM таблица2
INNER JOIN таблица1
ON таблица2.Место = таблица1.Место
AND таблица1.Нулевость = 1
WHERE
таблица2.Ключ = @Ключ
AND
(SELECT COUNT(*)
FROM таблица2
INNER JOIN таблица1
ON таблица2.Место = таблица1.Место AND
таблица2.Ключ = @Ключ AND таблица2.Расположение = 1
) > 1
group by таблица1.Место)

Похоже я что то неправильно воспринимаю, как работает max, он разве не должен дать одну строку максимальную по группируемому?
18 апр 19, 21:32    [21866620]     Ответить | Цитировать Сообщить модератору
 Re: Update max из одинаковых кроме id значений  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30726
Bulgat
Похоже я что то неправильно воспринимаю, как работает max, он разве не должен дать одну строку максимальную по группируемому?
Функция max возвращает значение, а не строку.
select max(таблица1.Место) возвращает из нескольких чисел Место то, которое самое большое.
То есть 107797.
А потом вы обновляете тот ID, который равен этому числу Место
То есть абсурдная операция получается.

Помочь написать запрос не могу, мне непонятна связка таблиц таблица1 и таблица2
Какая то страшная связка по неуникальным (в обоих таблицах) полям, смотреть больно, пойду почитаю Дейта, что бы успокоиться.
18 апр 19, 22:46    [21866651]     Ответить | Цитировать Сообщить модератору
 Re: Update max из одинаковых кроме id значений  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30726
alexeyvg
Помочь написать запрос не могу, мне непонятна связка таблиц таблица1 и таблица2
Какая то страшная связка по неуникальным (в обоих таблицах) полям, смотреть больно, пойду почитаю Дейта, что бы успокоиться.
Кстати, у вас и пост в форум задвоился.
Думаю, это как то связано.
18 апр 19, 22:47    [21866653]     Ответить | Цитировать Сообщить модератору
 Re: Update max из одинаковых кроме id значений  [new]
dklim.kzn
Member

Откуда: Казань
Сообщений: 123
для таких вещей есть два подхода
подзапрос с count, и по нему уже фильтровать id, где >1
либо оконные функции, модные и пачечно шустрые

прокатывает вот такое, например

select id,a,b,c,d
,count(*) over (partition by field/10)
from table
--where (count(*) over (partition by field/10))>1

но то, что закомменчено - не прокатывает, к сожалению, может допилят
тогда можно будет одним селектом/апдейтом обходиться
а сейчас это будет подзапрос, да ещё с distinct
поэтому в данном случае проще фильтровать традиционным подзапросом
select id,count(*)
from table
group by id

но оконки часто бывают удобнее, если допрасчет нужен для какой-нибудь жути из серии

update t
set c=0
from table t,
(
select id
,b/(avg(a) over (partition by field/10)) r
,b/(avg(a) over (partition by field)) rr
from table
) f
where t.id=f.id
and f.r>f.rr
19 апр 19, 09:22    [21866796]     Ответить | Цитировать Сообщить модератору
 Re: Update max из одинаковых кроме id значений  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Bulgat
...

Давай для начала в данных разберемся
CREATE TABLE #table1 ( [id] INT, [место] INT, [нулевость] TINYINT )
INSERT INTO #tables1
VALUES
( 346905, 107797, 1 ),
( 346907, 107797, 1 )
;
CREATE TABLE #table2 ( [id] INT, [ключ] VARCHAR(10), [место] INT, [расположение] INT )
INSERT INTO #tables2
VALUES
( 1694613, 'zs0001', 107797, 1 ),
( 1694612, 'zs0001', 107797, 1 )
;

У тебя при соединении этих таблиц по полю [место] на выходе будет 4 строки.
19 апр 19, 10:51    [21866888]     Ответить | Цитировать Сообщить модератору
 Re: Update max из одинаковых кроме id значений  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7385
Bulgat,

Вам нужно просветление по части реляционной теории баз данных. Иначе будет непонимание, почему "я думаю так, а оно вот этак".
19 апр 19, 13:44    [21867134]     Ответить | Цитировать Сообщить модератору
 Re: Update max из одинаковых кроме id значений  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30726
Руслан Дамирович
У тебя при соединении этих таблиц по полю [место] на выходе будет 4 строки.
Ничего вы не понимаете, он же соединяет [место] и [id]! И никаких дубликатов!
19 апр 19, 15:19    [21867279]     Ответить | Цитировать Сообщить модератору
 Re: Update max из одинаковых кроме id значений  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
alexeyvg
Руслан Дамирович
У тебя при соединении этих таблиц по полю [место] на выходе будет 4 строки.
Ничего вы не понимаете, он же соединяет [место] и [id]! И никаких дубликатов!

Н-да, невнимательно смотрел...
Но предположим, что ТС ошибся при написании скрипта.
19 апр 19, 15:57    [21867340]     Ответить | Цитировать Сообщить модератору
 Re: Update max из одинаковых кроме id значений  [new]
Bulgat
Member

Откуда:
Сообщений: 3
Да я ошибся, поменял
where таблица1.ID in
(select max(таблица1.Место)

where таблица1.ID in
(select max(таблица1.ID)

И теперь как мне надо работает

Всем спасибо, так бы не увидел ошибку
19 апр 19, 16:14    [21867362]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить