Обновите уникальные строки в SQL - PullRequest
1 голос
/ 01 сентября 2011

у меня есть стол

id | col1 | col3| col4
1  | x    |  r  |
2  | y    |  m  |
3  | z    |  p  |
4  | x    |  r  |

мне нужно обновить все уникальные строки этой таблицы * 1004 т.е. *

  id | col1 | col3| col4
  1  | x    |  r  |  1
  2  | y    |  m  |  1
  3  | z    |  p  |  1
  4  | x    |  r  |  0

я могу получить уникальные строки по

  select distinct col1,col2 from table

. Но как мне определить эти строки, чтобы обновить их? Пожалуйста, помогите.

Ответы [ 4 ]

4 голосов
/ 01 сентября 2011

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

SELECT MIN(ID) AS ID FROM TABLE GROUP BY COL1, COL3;

  id | col1 | col3
  1  | x    |  r  
  2  | y    |  m  
  3  | z    |  p  

Тогда

UPDATE TABLE SET col4 = 1 WHERE ID IN (SELECT MIN(ID) FROM TABLE GROUP BY COL1, COL3);

Ограничение: столбец id должен быть уникальным.

0 голосов
/ 01 сентября 2011

Еще одна слегка запутанная опция, чтобы установить значения 0 и 1 в одном попадании:

update my_table mt
set col4 = (
    select case when rn = 1 then 1 else 0 end
    from (
        select id,
            row_number() over (partition by col1, col3 order by id) as rn
        from my_table) tt
    where tt.id = mt.id);

4 rows updated.

select * from my_table order by id;

        ID COL1 COL3       COL4
---------- ---- ---- ----------
         1 x    r             1
         2 y    m             1
         3 z    p             1
         4 x    r             0

Это просто использование row_number(), чтобы решить, какая из уникальных комбинаций является первой, произвольно используя самое низкое id, присвоив этому значение единицу, а все остальное - ноль.

0 голосов
/ 01 сентября 2011

Вы также можете попробовать:

UPDATE test
   SET col4 = 1
 WHERE id IN
     (
       SELECT t1.id
         FROM table_name t1
         LEFT JOIN table_name t2
           ON t2.id < t1.id
          AND t2.col1 = t1.col1
          AND t2.col3 = t1.col3
        WHERE t2.id IS NULL
     )
0 голосов
/ 01 сентября 2011

Если это достаточно маленький стол, вот что вы можете сделать

Шаг 1: обновить все до 1

Update Table Set Col4 = 1

Шаг 2. Обновите все дубликаты до 0 (ОТНОМ)

Update Table
Set Col4 = 0
From 
(
    Select Col1, Min (Id) FirstId
    From Table
    Group By Col1
    Having Count (*) > 1
) Duplicates
Where Table.Col1 = Duplicates.Col1
And Table.Id <> Duplicates.FirstId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...