Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
select max(таблица1.Место) возвращает из нескольких чисел Место то, которое самое большое. То есть 107797. А потом вы обновляете тот ID, который равен этому числу Место То есть абсурдная операция получается. Помочь написать запрос не могу, мне непонятна связка таблиц таблица1 и таблица2 Какая то страшная связка по неуникальным (в обоих таблицах) полям, смотреть больно, пойду почитаю Дейта, что бы успокоиться. |
||
18 апр 19, 22:46 [21866651] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Думаю, это как то связано. |
||
18 апр 19, 22:47 [21866653] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Руслан Дамирович Member Откуда: Резиновая нерезиновая Сообщений: 940 |
Давай для начала в данных разберемся 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] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8335 |
Bulgat, Вам нужно просветление по части реляционной теории баз данных. Иначе будет непонимание, почему "я думаю так, а оно вот этак". |
19 апр 19, 13:44 [21867134] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
|
||
19 апр 19, 15:19 [21867279] Ответить | Цитировать Сообщить модератору |
Руслан Дамирович Member Откуда: Резиновая нерезиновая Сообщений: 940 |
Н-да, невнимательно смотрел... Но предположим, что ТС ошибся при написании скрипта. |
||||
19 апр 19, 15:57 [21867340] Ответить | Цитировать Сообщить модератору |
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 | ![]() |